anoosykh95

Untitled

Jul 22nd, 2016
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.14 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define P(x,y) make_pair(x,y)
  3. using namespace std;
  4. const int MX=100009 , MXL=18;
  5. // set those to appropriate values
  6. vector < int > v[MX];
  7. int n , QN , depth[MX] , par[MXL][MX] ;
  8. int sum[MX] ;
  9. void Pdfs(int x , int p){
  10.     int nxt , C , sz=v[x].size();
  11.     for(int j=0;j<sz;j++){
  12.         nxt=v[x][j];
  13.         if(nxt == p) continue;
  14.         depth[nxt]=depth[x]+1;
  15.         par[0][nxt]=x;
  16.         Pdfs(nxt , x);
  17.     }
  18. }
  19. void process(){
  20.     for(int j=1;j<MXL;j++)
  21.         for(int i=1;i<=n;i++)
  22.             par[j][i]=par[j-1][par[j-1][i]];
  23. }
  24. int Kth(int x , int K){
  25.     int node=x;
  26.     for(int j=0;j<MXL;j++)
  27.         if((K&(1<<j)))
  28.            node=par[j][node];
  29.     return node;
  30. }
  31. int LCA(int a , int b){
  32.     if(a==b) return a;
  33.     if(depth[a] > depth[b]) swap(a , b);
  34.     b=Kth(b , depth[b]-depth[a]);
  35.     if(a==b) return b;
  36.     for(int j=MXL-1;j>=0;j--)
  37.         if(par[j][a] != par[j][b])
  38.             a=par[j][a] , b=par[j][b];
  39.     return par[0][a];
  40. }
  41. int main(){
  42.    
  43.     for(int j=1;j<=n;j++) v[j].clear();
  44.     memset(par , 0 , sizeof(par));
  45.     depth[1]=1;
  46.     Pdfs(1 , -1);
  47.     process();
  48.  
  49.  
  50. }
Add Comment
Please, Sign In to add comment