Advertisement
tsypko

Untitled

Dec 22nd, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define null NULL
  5.  
  6. #define dbg if(0)
  7.  
  8. struct splay_tree {
  9. private:
  10.     struct node {
  11.         int key, sz, m, rev;
  12.         node *l, *r, *p;
  13.         node() {
  14.             rev = false;
  15.             l = r = p = null;
  16.             key = sz = m = 0;
  17.         }
  18.         node(int key) {
  19.             rev = false;
  20.             this->key = m = key;
  21.             sz = 1;
  22.             l = r = p = null;
  23.         }
  24.     };
  25.     typedef node *tnode;
  26.     node *root;
  27.     inline void set_parent(tnode child, tnode parent) {
  28.         if (child) {
  29.             child->p = parent;
  30.         }
  31.     }
  32.     inline void keep_parent(tnode v) {
  33.         set_parent(v->l, v);
  34.         set_parent(v->r, v);
  35.     }
  36.     inline int get_sz(tnode v) {
  37.         return (v ? v->sz : 0);
  38.     }
  39.     inline int get_min(tnode v) {
  40.         return (v ? v->m : INT_MAX);
  41.     }
  42.     inline void upd(tnode v) {
  43.         if (v) {
  44.             v->sz = 1 + get_sz(v->l) + get_sz(v->r);
  45.             v->m = min(v->key, min(get_min(v->l), get_min(v->r)));
  46.         }
  47.     }
  48.     inline void push(tnode v) {
  49.         if (v) {
  50.             if (v->rev) {
  51.                 swap(v->l, v->r);
  52.                 keep_parent(v);
  53.                 if (v->l) {
  54.                     v->l->rev ^= 1;
  55.                 }
  56.                 if (v->r) {
  57.                     v->r->rev ^= 1;
  58.                 }
  59.                 v->rev = false;
  60.             }
  61.         }
  62.     }
  63.     inline void rotate(tnode child, tnode parent) {
  64.         tnode gparent = parent->p;
  65.         if (gparent) {
  66.             (gparent->l == parent ? gparent->l : gparent->r) = child;
  67.         }
  68.         if (parent->l == child) {
  69.             parent->l = child->r;
  70.             child->r = parent;
  71.         } else {
  72.             parent->r = child->l;
  73.             child->l = parent;
  74.         }
  75.         keep_parent(child);
  76.         keep_parent(parent);
  77.         upd(parent);
  78.         upd(child);
  79.         child->p = gparent;
  80.     }
  81.     tnode splay(tnode v) {
  82.         if (!v->p)
  83.             return v;
  84.         if (!v->p->p) {
  85.             rotate(v, v->p);
  86.             return v;
  87.         }
  88.         tnode parent = v->p;
  89.         tnode gparent = parent->p;
  90.         if ((parent->l == v) == (gparent->l == parent)) {
  91.             rotate(parent, gparent);
  92.             rotate(v, parent);
  93.         } else {
  94.             rotate(v, parent);
  95.             rotate(v, gparent);
  96.         }
  97.         return splay(v);
  98.     }
  99.     tnode find(tnode v, int key) {
  100.         if (!v)
  101.             return null;
  102.         push(v);
  103.         if (get_sz(v->l) < key) {
  104.             key -= get_sz(v->l);
  105.         } else {
  106.             return find(v->l, key);
  107.         }
  108.         if (key == 1) {
  109.             return splay(v);
  110.         }
  111.         return find(v->r, key - 1);
  112.     }
  113.     void split(tnode t, int key, tnode &l, tnode &r) {
  114.         if (!t) {
  115.             l = r = null;
  116.             return;
  117.         }
  118.         push(t);
  119.         if (key == 0) {
  120.             l = null;
  121.             r = t;
  122.             return;
  123.         }
  124.         if (key == get_sz(t)) {
  125.             l = t;
  126.             r = null;
  127.             return;
  128.         }
  129.         t = find(t, key + 1);
  130.         l = t->l;
  131.         r = t;
  132.         r->l = null;
  133.         set_parent(l, null);
  134.         upd(l);
  135.         upd(r);
  136.     }
  137.     tnode merge(tnode l, tnode r) {
  138.         if (!l)
  139.             return r;
  140.         if (!r)
  141.             return l;
  142.         r = find(r, 1);
  143.         assert(get_sz(r->l) == 0);
  144.         r->l = l;
  145.         l->p = r;
  146.         upd(r);
  147.         return r;
  148.     }
  149.     inline int _get_min(int l, int r) {
  150.         tnode t1, t2, t3;
  151.         split(root, r, t2, t3);
  152.         split(t2, l - 1, t1, t2);
  153.         int ans = t2->m;
  154.         root = merge(t1, t2);
  155.         root = merge(root, t3);
  156.         return ans;
  157.     }
  158.     inline void _rev(int l, int r) {
  159.         tnode t1, t2, t3;
  160.         split(root, r, t2, t3);
  161.         split(t2, l - 1, t1, t2);
  162.         t2->rev ^= 1;
  163.         root = merge(t1, t2);
  164.         root = merge(root, t3);
  165.     }
  166.     void print(tnode t) {
  167.         if (!t)
  168.             return;
  169.         print(t->l);
  170.         cout << t->key << " ";
  171.         print(t->r);
  172.     }
  173. public:
  174.     splay_tree(vector<int> v) {
  175.         root = null;
  176.         for(int a : v){
  177.             tnode t = new node(a);
  178.             root = merge(root, t);
  179.         }
  180.     }
  181.     int get_min(int l, int r) {
  182.         return _get_min(l, r);
  183.     }
  184.     void rev(int l, int r) {
  185.         _rev(l, r);
  186.     }
  187.     void print() {
  188.         print(root);
  189.         cout << endl;
  190.     }
  191. };
  192.  
  193. #define endl "\n"
  194.  
  195. int main(int argc, char **argv) {
  196.     ios_base::sync_with_stdio(0);
  197.     cin.tie(0);
  198.     cout.tie(0);
  199.     int n, m;
  200.     scanf("%d%d\n", &n, &m);
  201.     vector<int> v(n);
  202.     for(int i = 0; i < n; i++){
  203.         scanf("%d", &v[i]);
  204.     }
  205.     scanf("\n");
  206.     splay_tree tree(v);
  207.     while (n--) {
  208.         int c;
  209.         int a, b;
  210.         scanf("%d%d%d\n", &c, &a, &b);
  211.         if (c == 1) {
  212.             tree.rev(a, b);
  213.         } else {
  214.             int ans = tree.get_min(a, b);
  215.             printf("%d\n", ans);
  216.         }
  217.     }
  218.     return 0;
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement