#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;

// I
//
//const int MAX_V = 5010;
//const int INF = 1e9;
//
//int V;
//struct edge { int to, cap, rev; };
//
//vector<edge> G[MAX_V];
//bool used[MAX_V];
//
//void add_edge(int from, int to, int cap) {
//	G[from].push_back(edge{ to, cap, int(G[to].size()) });
//	G[to].push_back(edge{ from, 0, int(G[from].size() - 1) });
//}
//
//int dfs(int v, int t, int f) {
//	if(v == t) return f;
//	used[v] = true;
//	for(edge& e : G[v]) {
//		if(!used[e.to] && e.cap > 0) {
//			int d = dfs(e.to, t, min(f, e.cap));
//			if(d > 0) {
//				e.cap -= d;
//				G[e.to][e.rev].cap += d;
//				return d;
//			}
//		}
//	}
//	return 0;
//}
//
//int max_flow(int s, int t, int lim = INF) {
//	int flow = 0;
//	while(1) {
//		fill(used, used + V, false);
//		int f = dfs(s, t, lim);
//		if(f == 0 || flow == lim) return flow;
//		flow += f;
//		lim -= f;
//	}
//	return -1;
//}
//
//int mod2[5000];

vector<int> G[5010];

int match;

int dfs(int v) {
	int rem = 1;
	for(auto c : G[v]) {
		int res = dfs(c);
		if(res == 1 && rem == 1) {
			rem = 0;
			match++;
		}
	}
	return rem;
}

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	int N;
	cin >> N;
	for(int i = 1; i <= N; i++) {
		int p;
		cin >> p;
		G[p].push_back(i);
		match = 0;
		dfs(0);
		cout << match << endl;
	}
}