func_code_string: #include <bits/stdc++.h>   using namespace std;   int q, n;   int par[1 << 20][32], dep[1 << 20];   int da[500000];   void add(int v) {     par[n][0] = par[n + 1][0] = v;     dep[n] = dep[n + 1] = dep[v] + 1;     for (int i = (int)(0); i < (int)(20); i++)       par[n][i + 1] = par[n + 1][i + 1] = par[par[n][i]][i];   }   int lca(int u, int v) {     if (dep[u] > dep[v]) swap(u, v);     int dif = dep[v] - dep[u];     for (int i = (int)(0); i < (int)(21); i++)       if (dif & (1 << i)) v = par[v][i];     if (u == v) return u;     for (int i = 20; i >= 0; i--)       if (par[u][i] != par[v][i]) {         u = par[u][i];         v = par[v][i];       }     return par[u][0];   }   int dist(int u, int v) { return dep[u] + dep[v] - 2 * dep[lca(u, v)]; }   void solve() {     int u = 2, v = 3, d = 2, x, i = 0, jos = q;     ;     dep[2] = dep[3] = dep[4] = 1;     par[2][0] = par[3][0] = par[4][0] = 1;     n = 5;     while (q--) {       scanf( %d , &x);       add(x);       int du = dist(n, u), dv = dist(n, v);       if (du > d)         v = n, d = du;       else if (dv > d)         u = n, d = dv;       n += 2;       da[i] = d;       i++;     }     int j;     for (j = 0; j < jos; j++) {       printf( %d n , da[j]);     }   }   int main() {     scanf( %d , &q);     solve();     return 0;   }   