Advertisement
tsypko

Untitled

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