func_code_string: #include <bits/stdc++.h>   using namespace std;   vector<int> g[100005];   int par[18][100005];   int depth[100005];   void dfs(int u, int p = 0, int d = 0) {     par[0][u] = p;     depth[u] = d;     for (int i = 0; i < g[u].size(); i++) {       int v = g[u][i];       if (v == p) continue;       dfs(v, u, d + 1);     }   }   int LCA(int a, int b) {     if (depth[a] < depth[b]) swap(a, b);     int diff = depth[a] - depth[b];     for (int i = 17; i >= 0; i--)       if ((diff >> i) & 1) a = par[i][a];     if (a == b) return a;     for (int i = 17; i >= 0; i--) {       if (par[i][a] != par[i][b]) a = par[i][a], b = par[i][b];     }     return par[0][a];   }   int dist(int a, int b) {     int lca = LCA(a, b);     return depth[a] + depth[b] - 2 * depth[lca];   }   int main() {     int n, q, p;     scanf( %d%d , &n, &q);     for (int i = 2; i <= n; i++)       scanf( %d , &p), g[i].push_back(p), g[p].push_back(i);     dfs(1);     for (int j = 1; j <= 17; j++)       for (int i = 1; i <= n; i++)         if (par[j - 1][i] != 0) par[j][i] = par[j - 1][par[j - 1][i]];     while (q--) {       int a[3];       scanf( %d%d%d , &a[0], &a[1], &a[2]);       int ans = -1;       for (int i = 0; i < 3; i++) {         for (int j = 0; j < 3; j++) {           for (int k = 0; k < 3; k++) {             if (i == j || i == k || j == k) continue;             int s = a[i], t = a[j], f = a[k];             ans = max(ans, (dist(s, f) + dist(t, f) - dist(s, t) + 1) / 2);           }         }       }       printf( %d n , ans + 1);     }   }   