func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1000010;   struct node {     int v, id;   } MAX[MAXN], MMAX[MAXN];   int n, f[MAXN];   int main() {     scanf( %d , &n);     n++;     MAX[1].v = MMAX[1].v = 0;     MAX[1].id = MMAX[1].id = 1;     for (register int i = 2; i <= n; i++) {       scanf( %d , &f[i]);       MAX[i].v = 0;       MMAX[i].v = 0;       MAX[i].id = MMAX[i].id = i;       int now = i;       while (now) {         if (MAX[f[now]].id == now) {           if (max(MAX[now].v, MMAX[now].v + 1) > MAX[f[now]].v) {             MAX[f[now]].v = max(MAX[now].v, MMAX[now].v + 1);           } else {             break;           }         } else if (MMAX[f[now]].id == now) {           if (max(MAX[now].v, MMAX[now].v + 1) > MAX[f[now]].v) {             swap(MAX[f[now]], MMAX[f[now]]);             MAX[f[now]].v = max(MAX[now].v, MMAX[now].v + 1);           } else if (max(MAX[now].v, MMAX[now].v + 1) > MMAX[f[now]].v) {             MMAX[f[now]].v = max(MAX[now].v, MMAX[now].v + 1);           } else {             break;           }         } else {           if (max(MAX[now].v, MMAX[now].v + 1) > MAX[f[now]].v) {             swap(MAX[f[now]], MMAX[f[now]]);             MAX[f[now]].v = max(MAX[now].v, MMAX[now].v + 1);             MAX[f[now]].id = now;           } else if (max(MAX[now].v, MMAX[now].v + 1) > MMAX[f[now]].v) {             MMAX[f[now]].v = max(MAX[now].v, MMAX[now].v + 1);             MMAX[f[now]].id = now;           } else {             break;           }         }         now = f[now];       }       printf( %d  , MAX[1].v);     }     return 0;   }   