Advertisement
RaFiN_

kth sorted element by per seg tree

Apr 5th, 2019
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1.  
  2. int arr[MAX],pk[MAX];
  3.  
  4. struct node{
  5.     node *left,*right;
  6.     int sum;
  7.     node(){
  8.         sum = 0;
  9.         left = right = NULL;
  10.     }
  11. }*root[MAX];
  12.  
  13. node* Build(int b,int e){
  14.     if(b==e){
  15.         node *ret = new node();
  16.         ret->sum = 0;
  17.         return ret;
  18.     }
  19.     int mid = (b+e)>>1;
  20.     node *ret = new node();
  21.     ret->left = Build(b,mid);
  22.     ret->right = Build(mid+1,e);
  23.     ret->sum = ret->left->sum + ret->right->sum;
  24.     return ret;
  25. }
  26.  
  27. node *update(node *ptr,int b,int e,int indx,int val){
  28.  
  29.     if(b>indx||indx>e)return ptr;
  30.     if(b==e){
  31.         node *ret = new node();
  32.         ret->sum =  val;
  33.         return ret;
  34.     }
  35.     int mid = (b+e)>>1;
  36.     node *ret = new node();
  37.     ret->left = update(ptr->left,b,mid,indx,val);
  38.     ret->right = update(ptr->right,mid+1,e,indx,val);
  39.     ret->sum = ret->left->sum + ret->right->sum;
  40.     return ret;
  41. }
  42.  
  43.  
  44. int query(node *l,node *r,int b,int e,int k){
  45.     if(b==e)return b;
  46.     int mid = (b+e)>>1;
  47.     ///cout<<b<<" "<<e<<" "<< r->left->sum<<" "<<l->left->sum<<endl;
  48.     int cnt = r->left->sum - l->left->sum;
  49.     if(cnt>=k)return query(l->left,r->left,b,mid,k);
  50.     else return query(l->right,r->right,mid+1,e,k-cnt);
  51.  
  52. }
  53.  
  54.  
  55. int main()
  56. {
  57.     ///booster()
  58.     ///read("input.txt");
  59.  
  60.     int n,q;
  61.     scani(n);
  62.     scani(q);
  63.     vi v;
  64.     map<int,int>m;
  65.     for(int i = 0;i<n;i++){
  66.         scani(arr[i]);
  67.         v.pb(arr[i]);
  68.     }
  69.     sort(all(v));
  70.     for(int i = 0;i<v.size();i++){
  71.         m[v[i]] = i+1;
  72.         pk[i+1] = v[i];
  73.     }
  74.     root[0] = Build(1,n);
  75.     for(int i = 0;i<n;i++){
  76.         root[i+1] = update(root[i],1,n,m[arr[i]],1);
  77.     }
  78.  
  79.     while(q--){
  80.         int l,r,k;
  81.         scani3(l,r,k);
  82.         OUT(pk[query(root[l-1],root[r],1,n,k)]);
  83.     }
  84.  
  85.  
  86.  
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement