Advertisement
Guest User

Untitled

a guest
Jun 26th, 2014
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <assert.h>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stack>
  9. #include <queue>
  10. #include <list>
  11. #include <set>
  12. #include <map>
  13. #include <string>
  14. #include <iostream>
  15. using namespace std;
  16.  
  17. int gcd(int a, int b) {
  18.     return b ? gcd(b, a % b) : a;
  19. }
  20.  
  21. struct TN {
  22.     int k, p, d;
  23.     TN *l, *r;
  24.     TN(int K) : k(K), p(rand()), d(K), l(0), r(0) {}
  25. };
  26.  
  27. class Treap {
  28.     TN *t;
  29.     int getD(TN *n) {
  30.         return n ? n->d : 0;
  31.     }
  32.     void update(TN *n) {
  33.         if (n)
  34.             n->d = gcd(n->k, gcd(getD(n->l), getD(n->r)));
  35.     }
  36.     TN *merge(TN *a, TN *b) {
  37.         if (!a || !b)
  38.             return a ? a : b;
  39.         if (a->p > b->p) {
  40.             a->r = merge(a->r, b);
  41.             update(a);
  42.             return a;
  43.         } else {
  44.             b->l = merge(a, b->l);
  45.             update(b);
  46.             return b;
  47.         }
  48.     }
  49.     void split(TN *t, int k, TN *&a, TN *&b) {
  50.         if (!t) {
  51.             a = b = 0;
  52.             return;
  53.         }
  54.         if (t->k > k) {
  55.             split(t->l, k, a, t->l);
  56.             b = t;
  57.         } else {
  58.             split(t->r, k, t->r, b);
  59.             a = t;
  60.         }
  61.         update(a);
  62.         update(b);
  63.     }
  64. public:
  65.     Treap() : t(0) {}
  66.     void add(int n) {
  67.         TN *a, *b;
  68.         split(t, n, a, b);
  69.         t = merge(merge(a, new TN(n)), b);
  70.     }
  71.     void del(int n) {
  72.         TN *a, *b, *c;
  73.         split(t, n - 1, a, b);
  74.         split(b, n, b, c);
  75.         b = merge(b->l, b->r);
  76.         t = merge(merge(a, b), c);
  77.     }
  78.     int getGcd() {
  79.         return t ? t->d : 1;
  80.     }
  81. } t;
  82.  
  83. int n, x;
  84. char c;
  85.  
  86. int main() {
  87.     scanf("%d", &n);
  88.     for (int i = 0; i < n; i++) {
  89.         scanf(" %c%d", &c, &x);
  90.         if (c == '+')
  91.             t.add(x);
  92.         else
  93.             t.del(x);
  94.         printf("%d\n", t.getGcd());
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement