Advertisement
Perlik

LCA_with_sparse_table

Jul 26th, 2011
418
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. using namespace std;
  5. const int N=400001;
  6. int n,logTable[N+1],f[22][N],first[N],h[N];
  7. vector <int> order,g[N];
  8. void dfs(int v,int cur)
  9. {
  10.     h[v]=cur;
  11.     first[v]=(int)order.size();
  12.     order.push_back(v);
  13.     for(size_t i=0;i<g[v].size();i++)
  14.         if (h[g[v][i]]==-1)
  15.         {
  16.             dfs(g[v][i],cur+1);
  17.             order.push_back(v);
  18.         }
  19. }
  20. int get_ans(int i,int j)
  21. {
  22.     if (i>j) swap(i,j);
  23.     int k=logTable[j-i];
  24.     int x=f[k][i];
  25.     int y=f[k][j-(1<<k)+1];
  26.     return h[order[x]]<=h[order[y]]?order[x]:order[y];
  27. }
  28. void sparse_table()
  29. {
  30.     f[0][0]=0;
  31.     f[0][1]=1;
  32.     for(int i=2;i<=n;i++)
  33.     {
  34.         logTable[i]=logTable[i>>1]+1;
  35.         f[0][i]=i;
  36.     }
  37.     for(int k=1;(1<<k)<n;k++)
  38.         for(int i=0;i+(1<<k)<=n;i++)
  39.         {
  40.             int x=f[k-1][i];
  41.             int y=f[k-1][i+(1<<k-1)];
  42.             f[k][i]=h[order[x]]<=h[order[y]]?x:y;
  43.         }
  44. }
  45. int main()
  46. {
  47.     int m,v;
  48.     long long sum=0,x,y,z,a1,a2;
  49.     scanf("%d%d",&n,&m);
  50.     for(int i=0;i<n-1;i++)
  51.     {
  52.         scanf("%d",&v);
  53.         g[v].push_back(i+1);
  54.         g[i+1].push_back(v);
  55.         first[i]=h[i]=-1;
  56.     }
  57.     first[n-1]=h[n-1]=-1;
  58.     cin>>a1>>a2>>x>>y>>z;
  59.     dfs(0,0);
  60.     sparse_table();
  61.     sum+=v=get_ans(first[a1],first[a2]);
  62.     for(int i=3;i<=(m<<1);i++)
  63.         if (i&1) a1=(a1*x+a2*y+z)%n; else sum+=v=get_ans(first[(a1+v)%n],first[a2=(a2*x+a1*y+z)%n]);
  64.     cout<<sum;
  65.     return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement