Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=2e5+7;
- int dep[N];
- int ac[N][20];
- inline int LCA(int u,int v){
- if(dep[u]<dep[v])swap(u,v);
- for(int i=17;~i;--i){
- if(dep[ac[u][i]]>=dep[v])u=ac[u][i];
- }
- if(u==v)return u;
- for(int i=17;~i;--i){
- if(ac[u][i]!=ac[v][i])u=ac[u][i],v=ac[v][i];
- }
- return ac[u][0];
- }
- inline int dist(int u,int v){
- return dep[u]+dep[v]-2*dep[LCA(u,v)];
- }
- int main(){
- freopen("forest.in","r",stdin);
- freopen("forest.out","w",stdout);
- int id;r(id);
- int n;r(n);
- int a=1,b=1,ans=0,dis=0,delta=0;
- for(int x=2;x<=n;++x){
- r(ac[x][0]);ac[x][0]^=ans;
- dep[x]=dep[ac[x][0]]+1;
- for(int i=1;(ac[x][i]=ac[ac[x][i-1]][i-1]);++i);
- int dis1=dist(a,x);
- int dis2=dist(b,x);
- if(dis1<=dis&&dis2<=dis){
- delta=max(delta,(dis1+dis2-dis)/2-1);
- }
- else {
- if(dis1>=dis2){
- b=x;
- dis=dis1;
- delta=max(delta,dis2/2-1);
- }
- else {
- a=x;
- dis=dis2;
- delta=max(delta,dis1/2-1);
- }
- }
- printf("%d\n",ans=(dis+delta));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment