Matrix_code

data-structure - Persistance Segment Tree (kthNUM)

Jul 1st, 2016 (edited)
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100005;
  4. int L[N*20], R[N*20], V[N*20];
  5.  
  6. int sz = 0;
  7. int a[N];
  8. int root[N];
  9.  
  10. void build(int &n,int b,int e)
  11. {
  12.     n = ++sz;
  13.     V[n] = 0;
  14.     if(b==e) return;
  15.     int mid = (b+e)/2;
  16.     build(L[n],b,mid);
  17.     build(R[n],mid+1,e);
  18. }
  19.  
  20. void update(int &n,int pre,int b,int e,int v)
  21. {
  22.     n = ++sz;
  23.     L[n] = L[pre],R[n] = R[pre],V[n] = V[pre];
  24.    
  25.     if(b==e && b == v ) {
  26.         V[n] ++;
  27.         return;
  28.     }
  29.     int mid = (b+e)/2;
  30.     if(v <= mid ) update(L[n], L[pre], b,mid, v);
  31.     else update(R[n], R[pre], mid+1,e, v);
  32.     V[n] = V[L[n]] + V[R[n]];
  33. }
  34.  
  35. int query(int r1,int r2,int b,int e,int k)
  36. {
  37.     if(b==e) return b;
  38.     int oo = V[L[r1]] - V[L[r2]];
  39.    
  40.     int mid = (b+e)/2;
  41.    
  42.     if(oo >= k ) return query(L[r1], L[r2],  b, mid, k);
  43.     else return query(R[r1], R[r2], mid+1,e, k - oo );
  44. }
  45. int main()
  46. {
  47.     int n,q;
  48.     scanf("%d %d",&n,&q);
  49.     vector<int>ar;
  50.    
  51.     for(int i = 1; i <= n; i ++ ) {
  52.         scanf("%d",&a[i]);
  53.         ar.push_back(a[i]);
  54.     }
  55.     sort(ar.begin() , ar.end());
  56.     ar.resize(unique(ar.begin() , ar.end()) - ar.begin()) ;
  57.     int SZ = (int)ar.size()-1;
  58.     build(root[0],0,SZ);
  59.     for(int i = 1; i <= n; i ++) {
  60.         int val = lower_bound(ar.begin() , ar.end(), a[i]) - ar.begin();
  61.         update(root[i] , root[i-1] , 0,SZ , val);
  62.     }
  63.     while(q--) {
  64.         int l,r,k;
  65.         scanf("%d %d %d",&l,&r,&k);
  66.         int v = query(root[r], root[l-1], 0,SZ , k);
  67.         printf("%d\n",ar[v]);
  68.     }
  69. }
Add Comment
Please, Sign In to add comment