#include <bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
using namespace std;
int N;
int depth[300111];
int parent[300111][19];
int LCA(int x, int y) {
  int i;
  if (depth[x] < depth[y]) swap(x, y);
  for (i = 18; i >= 0; --i) {
    if (depth[x] - (1 << i) >= depth[y]) {
      x = parent[x][i];
    }
  }
  if (x == y) return x;
  for (i = 18; i >= 0; --i) {
    if (parent[x][i] != parent[y][i]) {
      x = parent[x][i], y = parent[y][i];
    }
  }
  return parent[x][0];
}
void update(int x, int p) {
  int i;
  parent[x][0] = p;
  for (i = 1; i < 19; ++i) parent[x][i] = parent[parent[x][i - 1]][i - 1];
  depth[x] = depth[p] + 1;
}
int dist(int x, int y) { return depth[x] + depth[y] - 2 * depth[LCA(x, y)]; }
set<int> st1, st2;
int main() {
  int n, i, D = 0;
  scanf("%d", &n);
  st1.insert(1);
  for (i = 2; i <= n + 1; ++i) {
    int v;
    scanf("%d", &v);
    update(i, v);
    int d1 = st1.empty() ? 0 : dist(*st1.begin(), i),
        d2 = st2.empty() ? 0 : dist(*st2.begin(), i);
    if (max(d1, d2) > D) {
      if (max(d1, d2) == d1) {
        for (auto u : st2) {
          if (dist(u, i) == d1) {
            st1.insert(u);
          }
        }
        st2.clear();
        st2.insert(i);
      } else {
        for (auto u : st1) {
          if (dist(u, i) == d2) {
            st2.insert(u);
          }
        }
        st1.clear();
        st1.insert(i);
      }
      D = max(d1, d2);
    } else if (max(d1, d2) == D) {
      if (max(d1, d2) == d1) {
        st2.insert(i);
      } else {
        st1.insert(i);
      }
    }
    printf("%d\n", (int)st1.size() + st2.size());
  }
  return 0;
}
