Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 5;
- int n, q;
- vector<int>g[N];
- int dep[N];
- int parent[N][20];
- void dfs(int u, int p){
- parent[u][0] = p;
- for (int v : g[u]){
- if (v == p) continue;
- dep[v] = dep[u] + 1;
- dfs(v, u);
- }
- }
- int lca(int u, int v){
- if (dep[u] > dep[v]) swap(u, v);
- for (int k = 18; k >= 0; k--) {
- if (dep[parent[v][k]] >= dep[u]) {
- v = parent[v][k];
- }
- }
- for (int k = 18; k >= 0; k--){
- if (parent[u][k] != parent[v][k]){
- u = parent[u][k];
- v = parent[v][k];
- }
- }
- while (u != v) {
- u = parent[u][0];
- v = parent[v][0];
- }
- return u;
- }
- void preprocess(){
- dep[0] = 0;
- dfs(0, 0);
- for (int k = 1; k <= 18; k++){
- for (int i = 0; i < n; i++){
- parent[i][k] = parent[parent[i][k-1]][k-1];
- }
- }
- }
- int ans;
- void process(int a, int b, int c){
- int ac = lca(a, c);
- int ab = lca(a, b);
- int bc = lca(b, c);
- if (ab == bc){
- if (ac == b){
- ans = max(ans, 1);
- }
- else {
- if (ac != ab){
- int tmp = abs(dep[ab] - dep[b]) + abs(dep[ab] - dep[ac]) + 1;
- ans = max(ans, tmp);
- }
- else {
- ans = max(ans, abs(dep[ac] - dep[b]) + 1);
- }
- }
- }
- else {
- ans = max(ans, 1 + abs(dep[b] - max(dep[ab], dep[bc])));
- }
- }
- int main(){
- cin >> n >> q;
- for (int i = 1; i < n; i++){
- int x;
- cin >> x;
- x--;
- g[i].push_back(x);
- g[x].push_back(i);
- }
- preprocess();
- while(q--){
- int a, b, c;
- cin >> a >> b >> c;
- a--, b--, c--;
- ans = 0;
- process(a, b, c);
- process(b, a, c);
- process(a, c, b);
- cout << ans << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement