#define debug
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n = 4, m;
int u = 3, v = 2;
int dis[N];
int dep[N], dp[N][25];
int lca(int x, int y) {
if(dep[x] > dep[y]) {
swap(x, y);
}
for(int i = 24; i >= 0; i--) {
if(dep[x] <= dep[dp[y][i]]) {
y = dp[y][i];
}
}
if(x == y) {
return x;
}
for(int i = 24; i >= 0; i--) {
if(dp[x][i] != dp[y][i]) {
x = dp[x][i], y = dp[y][i];
}
}
return dp[x][0];
}
void update(int x){
int zhijing_3 = dis[u] + dis[v] - 2 * dis[lca(u, v)];
int zhijing_1 = dis[x] + dis[u] - 2 * dis[lca(x, u)];
int zhijing_2 = dis[x] + dis[v] - 2 * dis[lca(x, v)];
if(zhijing_3 > zhijing_1 && zhijing_3 > zhijing_2){
return ;
}
else if(zhijing_1 > zhijing_2){
v = x;
}
else{
u = x;
}
}
void Solve(){
cin >> m;
dis[2] = dis[3] = dis[4] = 1;
dep[1] = 0;
dep[2] = dep[3] = dep[4] = 1;
dp[2][0] = dp[3][0] = dp[4][0] = 1;
while(m--){
int x;
cin >> x;
dep[n + 1] = dep[x] + 1;
dep[n + 2] = dep[x] + 1;
dis[n + 1] = dis[x] + 1;
dis[n + 2] = dis[x] + 1;
dp[n + 1][0] = dp[n + 2][0] = x;
for(int i = 1; i <= 20; i++){
dp[n + 1][i] = dp[dp[n + 1][i - 1]][i - 1];
}
for(int i = 1; i <= 20; i++){
dp[n + 2][i] = dp[dp[n + 2][i - 1]][i - 1];
}
update(n + 1);
update(n + 2);
n += 2;
cout << dis[u] + dis[v] - 2 * dis[lca(u, v)] << endl;
}
}
int main(){
#ifdef debug
freopen("Code.in", "r", stdin);
freopen("Code.out", "w", stdout);
#endif
Solve();
return 0;
}
求助大佬。