#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;
}
