Advertisement
Guest User

Untitled

a guest
May 26th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. ifstream f("lca.in");
  8. ofstream g("lca.out");
  9.  
  10. vector <int> v[100010];
  11.  
  12. int lev[250010], e[250010], poz[100010], p[25];
  13.  
  14. int n,i,k,m,x,j,a,b,d;
  15.  
  16. int rmq[20][250010];
  17.  
  18. void dfe(int x, int l)
  19. {
  20.     ++n;
  21.     lev[n]=l;
  22.     e[n]=x;
  23.     poz[x]=n;
  24.  
  25.     for(int i=0; i<v[x].size(); ++i)
  26.     {
  27.         dfe(v[x][i],l+1);
  28.         ++n;
  29.         e[n]=x;
  30.         lev[n]=l;
  31.     }
  32. }
  33.  
  34. inline int log(int x)
  35. {
  36.     int i=0;
  37.     while(p[i+1]<x)
  38.         ++i;
  39.     return i;
  40. }
  41.  
  42. int main()
  43. {
  44.     f>>n>>m;
  45.     for(i=2; i<=n; ++i)
  46.     {
  47.         f>>x;
  48.         v[x].push_back(i);
  49.     }
  50.  
  51.     p[0]=1;
  52.     for(i=1; i<20; ++i)
  53.         p[i]=p[i-1]*2;
  54.  
  55.     n=0;
  56.     dfe(1,0);
  57.  
  58.     for(i=1; i<=n; ++i)
  59.         rmq[0][i]=i;
  60.  
  61.     k=log(n)+1;
  62.     for(i=1; i<k; ++i)
  63.     {
  64.         for(j=1; j<=n; ++j)
  65.         {
  66.             if(lev[rmq[i-1][j+p[i-1]]]<lev[rmq[i-1][j]])
  67.                 rmq[i][j]=rmq[i-1][j+p[i-1]];
  68.             else
  69.                 rmq[i][j]=rmq[i-1][j];
  70.         }
  71.     }
  72.  
  73.     for(i=1; i<=m; ++i)
  74.     {
  75.         f>>a>>b;
  76.         a=poz[a];
  77.         b=poz[b];
  78.         if(a>b)
  79.             swap(a,b);
  80.  
  81.         d=b-a+1;
  82.         k=log(d);
  83.  
  84.         if(lev[rmq[k][a]]<lev[rmq[k][b-p[k]+1]])
  85.                 cout<<e[rmq[k][a]]<<'\n';
  86.             else
  87.                 cout<<e[rmq[k][b-p[k]+1]]<<'\n';
  88.  
  89.         g<<e[a]<<'\n';
  90.     }
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement