Advertisement
tsypko

Untitled

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