#include <bits/stdc++.h>
using namespace std;
int parent[1000000 + 1];
int v[1000000 + 1];
pair<int, int> my_max[1000000 + 1][2];
int max_size[1000000 + 1];
int main() {
  int n, p;
  scanf("%d", &n);
  parent[0] = -1;
  v[0] = 1;
  max_size[0] = 0;
  for (int i = 0; i < n; ++i) {
    scanf("%d", &parent[i + 1]);
    parent[i + 1]--;
    v[i + 1] = 1;
    max_size[i + 1] = 0;
    int ptr = i + 1;
    int flag = 1;
    while (parent[ptr] != -1 && flag) {
      flag = 0;
      int pptr = parent[ptr];
      if (max_size[pptr] == 0) {
        my_max[pptr][max_size[pptr]++] = make_pair(v[ptr], ptr);
        v[pptr] = my_max[pptr][0].first;
        flag = 1;
      } else if (max_size[pptr] == 1) {
        if (my_max[pptr][0].second == ptr) {
          if (my_max[pptr][0].first < v[ptr]) {
            my_max[pptr][0].first = v[ptr];
            v[pptr] = my_max[pptr][0].first;
            flag = 1;
          }
        } else {
          my_max[pptr][max_size[pptr]++] = make_pair(v[ptr], ptr);
          if (my_max[pptr][0] < my_max[pptr][1]) {
            pair<int, int> pair_tmp;
            pair_tmp = my_max[pptr][0];
            my_max[pptr][0] = my_max[pptr][1];
            my_max[pptr][1] = pair_tmp;
          }
          if (v[pptr] < max(my_max[pptr][0].first, my_max[pptr][1].first + 1)) {
            v[pptr] = max(my_max[pptr][0].first, my_max[pptr][1].first + 1);
            flag = 1;
          }
        }
      } else {
        if (my_max[pptr][0].second == ptr) {
          my_max[pptr][0].first = v[ptr];
        } else if (my_max[pptr][1].second == ptr) {
          my_max[pptr][1].first = v[ptr];
          if (my_max[pptr][0] < my_max[pptr][1]) {
            pair<int, int> pair_tmp;
            pair_tmp = my_max[pptr][0];
            my_max[pptr][0] = my_max[pptr][1];
            my_max[pptr][1] = pair_tmp;
          }
        } else {
          if (my_max[pptr][1].first < v[ptr]) {
            my_max[pptr][1].first = v[ptr];
            my_max[pptr][1].second = ptr;
          }
          if (my_max[pptr][0] < my_max[pptr][1]) {
            pair<int, int> pair_tmp;
            pair_tmp = my_max[pptr][0];
            my_max[pptr][0] = my_max[pptr][1];
            my_max[pptr][1] = pair_tmp;
          }
        }
        if (v[pptr] < max(my_max[pptr][0].first, my_max[pptr][1].first + 1)) {
          v[pptr] = max(my_max[pptr][0].first, my_max[pptr][1].first + 1);
          flag = 1;
        }
      }
      ptr = pptr;
    }
    if (i) printf(" ");
    printf("%d", my_max[0][0].first);
  }
  printf("\n");
  return 0;
}
