#include <bits/stdc++.h>
using namespace std;
int dp[1100005][22] = {0};
int depth[1100005];
void add(int x, int p) {
  depth[x] = depth[p] + 1;
  dp[x][0] = p;
  for (int i = 1; i < 22; ++i) dp[x][i] = dp[dp[x][i - 1]][i - 1];
}
int lca(int a, int b) {
  if (depth[a] < depth[b]) return lca(b, a);
  int diff = depth[a] - depth[b];
  for (int i = 0; i < 22; ++i)
    if ((1 << i) & diff) a = dp[a][i];
  if (a == b) return a;
  for (int i = 22 - 1; i >= 0; --i) {
    if (dp[a][i] != dp[b][i]) {
      b = dp[b][i];
      a = dp[a][i];
    }
  }
  return dp[a][0];
}
int dist(int a, int b) { return depth[a] + depth[b] - 2 * depth[lca(a, b)]; }
int main() {
  depth[1] = 1;
  add(2, 1);
  add(3, 1);
  add(4, 1);
  int d1 = 2, d2 = 3;
  int best = 2;
  int q;
  int n = 4;
  scanf("%d", &q);
  while (q--) {
    int p;
    scanf("%d", &p);
    n++;
    add(n, p);
    int b = n;
    if (dist(b, d1) > best) {
      best = dist(b, d1);
      d2 = b;
    }
    if (dist(b, d2) > best) {
      best = dist(b, d2);
      d1 = b;
    }
    n++;
    b = n;
    add(n, p);
    if (dist(b, d1) > best) {
      best = dist(b, d1);
      d2 = b;
    }
    if (dist(b, d2) > best) {
      best = dist(b, d2);
      d2 = b;
    }
    printf("%d\n", best);
  }
  return 0;
}
