Advertisement
KiK0S

treap

Dec 4th, 2017
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct tree{
  5.     int sz = 1, y = rand(), ans = 2e9;
  6.     tree *l = nullptr, *r = nullptr;
  7.     int rev = 0, val;
  8.     tree(int a){
  9.         val = a;
  10.         ans = a;
  11.     }
  12. };
  13.  
  14. void print(tree *v){
  15.     if(v == nullptr) return;
  16.     print(v->l);
  17.     cout<<v->val<<" ";
  18.     print(v->r);
  19. }
  20.  
  21. void push(tree *t){
  22.     if(t == nullptr) return;
  23.     if(t->rev == 0) return;
  24.     swap(t->l, t->r);
  25.     t->rev = 0;
  26.     if(t->l != nullptr){
  27.         t->l->rev ^= 1;
  28.     }
  29.     if(t->r != nullptr){
  30.         t->r->rev ^= 1;
  31.     }
  32. }
  33.  
  34. void upd(tree *t){
  35.     if(t == nullptr){
  36.         return;
  37.     }
  38.     push(t);
  39.     t->ans = t->val;
  40.     t->sz = 1;
  41.     if(t->l != nullptr){
  42.         t->sz += t->l->sz;
  43.         t->ans = min(t->ans, t->l->ans);
  44.     }
  45.     if(t->r != nullptr){
  46.         t->sz += t->r->sz;
  47.         t->ans = min(t->ans, t->r->ans);
  48.     }
  49. }
  50.  
  51. int getsz(tree *t){
  52.     if(t == nullptr) return 0;
  53.     return t->sz;
  54. }
  55.  
  56. void merge(tree *&t, tree *l, tree *r){
  57.     upd(l);
  58.     upd(r);
  59.     if(l == nullptr){
  60.         t = r;
  61.     }
  62.     else if(r == nullptr){
  63.         t = l;
  64.     }
  65.     else if(l->y > r->y){
  66.         merge(l->r, l->r, r);
  67.         t = l;
  68.     }
  69.     else {
  70.         merge(r->l, l, r->l);
  71.         t = r;
  72.     }
  73.     upd(t);
  74. }
  75.  
  76.  
  77. void split(tree *t, tree *&l, tree *&r, int val){
  78.     upd(t);
  79.     if(t == nullptr){
  80.         l = nullptr;
  81.         r = nullptr;
  82.         return;
  83.     }
  84.     int tmp = getsz(t->l) + 1;
  85.     if(tmp < val){
  86.         split(t->r, t->r, r, val - tmp);
  87.         l = t;
  88.     }
  89.     else{
  90.         split(t->l, l, t->l, val);
  91.         r = t;
  92.     }
  93.     upd(l);
  94.     upd(r);
  95. }
  96.  
  97.  
  98.  
  99. void get(tree *t, int tl, int tr, int type){
  100.     tree *l, *r, *m;
  101.     split(t, l, r, tr + 1);
  102.     split(l, l, m, tl);
  103.     if(type == 1)m->rev ^= 1;
  104.     else cout<<m->ans<<endl;
  105.     merge(l, l, m);
  106.     merge(t, l, r);
  107. }
  108.  
  109.  
  110. int main(){
  111.     int n, m;
  112.     cin>>n>>m;
  113.     int tmp;
  114.     cin>>tmp;
  115.     tree *root = new tree(tmp);
  116.     for(int i = 1; i < n; i++){
  117.         cin>>tmp;
  118.         merge(root, root, new tree(tmp));
  119.     }
  120.     for(int i = 0; i < m; i++){
  121.         int a, b, c;
  122.         cin>>c>>a>>b;
  123.         get(root, a, b, c);
  124.     }
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement