func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:667772160 )   using namespace std;   struct __isoff {     __isoff() {       if (0) freopen( input.txt ,  r , stdin), freopen( output.txt ,  w , stdout);       srand( C  +  T  +  A  +  C  +  Y  +  M  +  B  +  A );     }     ~__isoff() {}   } __osafwf;   const unsigned long long p1 = 31;   const unsigned long long p2 = 29;   const double eps = 1e-8;   const double pi = acos(-1.0);   const int infi = 1e9 + 7;   const long long inf = 1e18 + 7;   const long long dd = 2e5 + 7;   const long long mod = 1e9 + 7;   const int logc = 20;   int up[dd][logc], H[dd], in[dd], out[dd], ti = 0;   vector<int> P[dd];   void dfs(int v, int p = 0, int h = 0) {     H[v] = h;     in[v] = ti++;     up[v][0] = p;     for (int i = 1; i < logc; i++) {       up[v][i] = up[up[v][i - 1]][i - 1];     }     for (auto it : P[v]) {       if (it != p) {         dfs(it, v, h + 1);       }     }     out[v] = ti++;   }   void build() { dfs(0); }   bool is(int a, int b) { return in[a] <= in[b] && out[b] <= out[a]; }   int lca(int a, int b) {     if (is(a, b)) {       return a;     }     if (is(b, a)) {       return b;     }     for (int i = logc - 1; i >= 0; i--) {       int t = up[a][i];       if (!is(t, b)) {         a = t;       }     }     return up[a][0];   }   int dis(int a, int b) { return H[a] + H[b] - 2 * H[lca(a, b)]; }   int main() {     int n;     cin >> n;     vector<int> E;     for (long long i = 0; i < (long long)n - 1; i++) {       int t;       cin >> t;       t--;       P[t].push_back(i + 1);       E.push_back(i + 1);     }     build();     int a = 0, b = 0, l = 0;     for (long long i = 0; i < (long long)n - 1; i++) {       int t = E[i];       if (l < dis(a, t)) {         l = dis(a, t);         b = t;       }       if (l < dis(b, t)) {         l = dis(b, t);         a = t;       }       cout << l <<   n ;     }   }   