Matrix_code

data-structure - Persistent Segment Tree ( COT )

Apr 23rd, 2016 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /*------- Constants---- */
  4.  
  5. #define Long                    long long
  6. #define Ulong                   unsigned long long
  7. #define forn(i,n)               for( int i=0 ; i < n ; i++ )
  8. #define mp(i,j)                 make_pair(i,j)
  9. #define pb(a)                   push_back((a))
  10. #define all(x)                  (x).begin(),(x).end()
  11. #define gc                      getchar_unlocked
  12. #define PI                      acos(-1.0)
  13. #define EPS                     1e-9
  14. #define xx                      first
  15. #define yy                      second
  16. #define lc                      ((n)<<1)
  17. #define rc                      ((n)<<1|1)
  18. #define db(x)                   cout << #x << " -> " << x << endl;
  19. #define Di(x)                   int x;scanf("%d",&x)
  20. #define min(a,b)                ((a)>(b) ? (b) : (a) )
  21. #define max(a,b)                ((a)>(b) ? (a):(b))
  22. #define ms(ara_name,value)      memset(ara_name,value,sizeof(ara_name))
  23.  
  24. /*************************** END OF TEMPLATE ****************************/
  25.  
  26. const int N = 300004 , LG = 19;
  27. int n,m,S,sz;
  28. vector<int> G[N];
  29. int value[N];
  30. vector<int>v;
  31. int P[N][20], lev[N];
  32. int root[N];
  33. struct Node{ // Segment Tree node
  34.     int ls,rs,cnt;
  35. }node[N*20];
  36.  
  37. void update(int &n,int pre,int b,int e,int v)
  38. {
  39.     n = ++sz;
  40.     node[n] = node[pre];
  41.     if(b==e && b == v ) {
  42.         node[n].cnt ++;
  43.         return;
  44.     }
  45.     int mid = (b+e)/2;
  46.     if(v <= mid ) update(node[n].ls, node[pre].ls, b,mid, v);
  47.     else update(node[n].rs, node[pre].rs, mid+1,e, v);
  48.     node[n].cnt = node[node[n].ls].cnt + node[node[n].rs].cnt;
  49. }
  50.  
  51. int query(int r1,int r2,int r3,int r4, int b,int e,int k)
  52. {
  53.     if(b==e) return b;
  54.     int oo = node[node[r1].ls].cnt + node[node[r2].ls].cnt - node[node[r3].ls].cnt - node[node[r4].ls].cnt ;
  55.    
  56.     int mid = (b+e)/2;
  57.    
  58.     if(oo >= k ) return query(node[r1].ls, node[r2].ls, node[r3].ls, node[r4].ls, b, mid, k);
  59.     else return query(node[r1].rs, node[r2].rs, node[r3].rs, node[r4].rs, mid+1,e, k - oo );
  60. }
  61.  
  62.  
  63. void dfs(int u,int p)
  64. {
  65.     int Sz = G[u].size();
  66.     for(int i = 0;i < Sz ; i ++ ){
  67.         int a = G[u][i];
  68.         if(a!=p) {
  69.             update(root[a], root[u], 1, S, value[a] );
  70.             lev[a] = 1 + lev[u];
  71.             dfs(a,u);
  72.             P[a][0] = u;
  73.         }
  74.     }
  75. }
  76. int lca(int u,int v)
  77. {
  78.     if(lev[u] > lev[v]) swap(u,v);
  79.     int d = lev[v] - lev[u];
  80.     for(int i = LG - 1; i >= 0 ;  i -- ) {
  81.         if( d  &1<<i){
  82.             v = P[v][i];
  83.         }
  84.     }
  85.    
  86.     if(u==v) return u;
  87.     for(int i = LG-1; i >= 0 ; i -- ) {
  88.         if(P[u][i] != P[v][i]) {
  89.             u = P[u][i];
  90.             v = P[v][i];
  91.         }
  92.     }
  93.     return P[v][0];
  94. }
  95. int main()
  96. {
  97.     //freopen("in.txt","r",stdin);
  98.     scanf("%d %d",&n,&m);
  99.     for(int i = 1;i <= n; i ++) scanf("%d",&value[i]) , v.pb(value[i]);
  100.     sort(all(v));
  101.     v.resize(unique(all(v)) - v.begin());
  102.     for(int i = 1; i <= n; i ++ ) value[i] = lower_bound(all(v),value[i]) - v.begin()  + 1;
  103.     for(int i = 1; i <= n-1; i ++ ) {
  104.         int a,b;
  105.         scanf("%d %d",&a,&b);
  106.         G[a].pb(b);
  107.         G[b].pb(a);
  108.     }
  109.     ms(P,-1);
  110.     S = v.size();
  111.     update(root[1],0,1,S,value[1]);
  112.     dfs(1,-1);
  113.    
  114.     for(int i = 1; i < LG;  i ++ ) {
  115.         for(int j= 1; j <= n; j ++ ) {
  116.             if(P[j][i-1] != -1) P[j][i] = P[P[j][i-1]][i-1];
  117.         }
  118.     }
  119.  
  120.     while(m--){
  121.         int a,b,x;
  122.         scanf("%d %d %d",&a,&b,&x);
  123.         int lo = lca(a,b);
  124.        
  125.         int id = query(root[a],root[b], root[lo], P[lo][0] == -1 ? 0 : root[P[lo][0]] , 1 , S , x);
  126.         printf("%d\n" , v[id-1]);
  127.     }
  128.     return 0;
  129. }
Add Comment
Please, Sign In to add comment