Advertisement
Malinovsky239

Untitled

Nov 5th, 2011
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <ctime>
  6.  
  7. using namespace std;
  8.  
  9. #define ls first
  10. #define rs second
  11. #define N int(3e5 + 5)
  12. #define pair pair<int, int>
  13. #define MOD int(1e9)
  14.  
  15. struct treap {
  16.     int x, y, l, r;
  17.  
  18.     treap() {}
  19.  
  20.     treap(int a, int b, int c, int d) {
  21.         x = a, y = b, l = c, r = d;
  22.         //fprintf(stderr, "(%d, %d, %d, %d)\n", a, b, c, d);
  23.     }
  24. };
  25.  
  26. treap t[N];
  27. int num = 1, root = 1;
  28.  
  29. int merge(int l, int r) {
  30.     //cerr << l << " " << r << " " << (t[l].r) << " " << t[r].r << endl;
  31.     if (l == 0 || r == 0) return max(l, r);
  32.     if (t[l].y < t[r].y) {
  33.         //cerr << "1 ->\n";
  34.         t[r].l = merge(l, t[r].l);
  35.         return r;      
  36.     }
  37.     else {
  38.         //cerr << "2 ->\n";
  39.         t[l].r = merge(t[l].r, r);
  40.         return l;
  41.     }
  42. }
  43.  
  44. pair split(int v, int x) {
  45.     if (!v) return make_pair(0, 0);
  46.     if (t[v].x < x) {
  47.         pair res = split(t[v].r, x);
  48.         t[v].r = res.ls;
  49.         return make_pair(v, res.rs);       
  50.     }
  51.     else {
  52.         pair res = split(t[v].l, x);
  53.         t[v].l = res.rs;
  54.         return make_pair(res.ls, v);
  55.     }
  56. }
  57.  
  58. int find(int v, int val) {
  59.     if (t[v].x == val) return val;
  60.     if (t[v].x < val) {
  61.         if (!t[v].r) return t[v].x;    
  62.         return find(t[v].r, val);
  63.     }  
  64.     else {
  65.         if (!t[v].l) return t[v].x;
  66.         return find(t[v].l, val);
  67.     }
  68. }
  69.  
  70. void print(int v, int sp) {
  71.     if (!v) return;
  72.     print(t[v].r, sp + 1);
  73.     fprintf(stderr, "%*d\n", sp * 5, t[v].x);
  74.     print(t[v].l, sp + 1);
  75.     if (!sp)
  76.         fprintf(stderr, "-------------\n");
  77. }
  78.  
  79. void insert(int x) {
  80.     if (find(root, x) == x) return;
  81.     int y = rand() * RAND_MAX + rand();
  82.     pair res = split(root, x);
  83.     t[++num] = treap(x, y, 0, 0);
  84.     root = merge(res.ls, num); 
  85.     root = merge(root, res.rs);
  86. }
  87.  
  88. int main() {
  89.     freopen("next.in", "r", stdin);
  90.     freopen("next.out", "w", stdout);
  91.  
  92.     srand(time(NULL));
  93.  
  94.     t[1] = treap(-1, rand() * RAND_MAX + rand(), 0, 0);
  95.  
  96.     int n, prev = 0;
  97.     cin >> n;
  98.     for (int i = 0; i < n; i++) {
  99.         char op;
  100.         int num;
  101.         cin >> op >> num;
  102.  
  103.         if (op == '?') {
  104.             //print(root, 0);
  105.             pair res = split(root, num);
  106.             int now = res.rs, ans;
  107.  
  108.             if (!now) {
  109.                 ans = -1;
  110.             }
  111.             else {
  112.                 while (t[now].l)
  113.                     now = t[now].l;
  114.                 ans = t[now].x;
  115.             }
  116.             prev = ans;
  117.             cout << ans << endl;
  118.  
  119.             root = merge(res.ls, res.rs);
  120.         }
  121.         else {
  122.             insert((num + prev) % MOD);
  123.             prev = 0;
  124.         }
  125.     }
  126.  
  127.     return 0;
  128. }
  129.  
  130.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement