yicongli

T163T3

Mar 29th, 2019
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=2e5+7;
  17.  
  18. int dep[N];
  19. int ac[N][20];
  20.  
  21. inline int LCA(int u,int v){
  22.     if(dep[u]<dep[v])swap(u,v);
  23.     for(int i=17;~i;--i){
  24.         if(dep[ac[u][i]]>=dep[v])u=ac[u][i];
  25.     }
  26.     if(u==v)return u;
  27.     for(int i=17;~i;--i){
  28.         if(ac[u][i]!=ac[v][i])u=ac[u][i],v=ac[v][i];
  29.     }
  30.     return ac[u][0];
  31. }
  32.  
  33. inline int dist(int u,int v){
  34.     return dep[u]+dep[v]-2*dep[LCA(u,v)];
  35. }
  36.  
  37. int main(){
  38.     freopen("forest.in","r",stdin);
  39.     freopen("forest.out","w",stdout);
  40.     int id;r(id);
  41.     int n;r(n);
  42.     int a=1,b=1,ans=0,dis=0,delta=0;
  43.     for(int x=2;x<=n;++x){
  44.         r(ac[x][0]);ac[x][0]^=ans;
  45.         dep[x]=dep[ac[x][0]]+1;
  46.         for(int i=1;(ac[x][i]=ac[ac[x][i-1]][i-1]);++i);
  47.         int dis1=dist(a,x);
  48.         int dis2=dist(b,x);
  49.         if(dis1<=dis&&dis2<=dis){
  50.             delta=max(delta,(dis1+dis2-dis)/2-1);
  51.         }
  52.         else {
  53.             if(dis1>=dis2){
  54.                 b=x;
  55.                 dis=dis1;
  56.                 delta=max(delta,dis2/2-1);
  57.             }
  58.             else {
  59.                 a=x;
  60.                 dis=dis2;
  61.                 delta=max(delta,dis1/2-1);
  62.             }
  63.         }
  64.         printf("%d\n",ans=(dis+delta));
  65.     }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment