Guest User

Untitled

a guest
Feb 19th, 2016
590
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const long long mod = 1e9 + 7;
  4. const double eps = 1e-15;
  5. const double PI = atan(1.0);
  6. #define readFile freopen("input","r",stdin)
  7. #define writeFile freopen("output","w",stdout)
  8. #define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  9. typedef pair<int,long long> ii;
  10. typedef unsigned long long ULL;
  11. const int N = 1001;
  12. char c;
  13. int n,num;
  14. int gcd(int a,int b){
  15.     return b?gcd(b,a%b):a;
  16. }
  17.  
  18. struct genn{
  19. private:
  20.     ULL x,y,z,w,t;
  21. public:
  22.     genn(){
  23.         x=1,y=2,z=3,w=4;
  24.     }
  25.     ULL next(){
  26.         t = x^(x<<15);
  27.         x=y,y=z,z=w;
  28.         return w = w^(w>>18)^t^(t>>9);
  29.     }
  30. };
  31. genn gen = genn();
  32. struct treap{
  33.     treap *l,*r;
  34.     ULL p;
  35.     int val;
  36.     int gg;
  37.    
  38.     treap(){l = r = NULL;}
  39.     treap(int val){
  40.         p = gen.next();
  41.         this->val = gg = val;
  42.         l = r = NULL;
  43.     }
  44. };
  45. #define pnode treap*
  46. int g(pnode node){
  47.     return node?node->gg:0;
  48. }
  49. void ug(pnode node){
  50.     if (node){
  51.         node->gg = gcd(node->val,gcd(g(node->l),g(node->r)));
  52.     }
  53. }
  54.  
  55. void split(pnode node,pnode &l,pnode &r,int key){
  56.     if (!node) l = r = NULL;
  57.     else if (node->val <= key) split(node->r,node->r,r,key),l = node;
  58.     else split(node->l,l,node->l,key),r = node;
  59.     ug(node);
  60. }
  61.  
  62. void merge(pnode &node,pnode l,pnode r){
  63.     if (!l||!r) node = l?l:r;
  64.     else if (l->p>r->p){
  65.         merge(l->r,l->r,r),node = l;
  66.     }
  67.     else {
  68.         merge(r->l,l,r->l),node = r;
  69.     }
  70.     ug(node);
  71. }
  72.  
  73. void insert(pnode &node,pnode &ins){
  74.     if (!node) node = ins;
  75.     else if (node->p<ins->p) split(node,ins->l,ins->r,ins->val),node = ins;
  76.     else {
  77.         if (ins->val<=node->val) insert(node->l,ins);
  78.         else insert(node->r,ins);
  79.     }
  80.     ug(node);
  81. }
  82. void erase(pnode &node,int key){
  83.     if (!node) return;
  84.     if (node->val == key){
  85.         pnode temp = node;
  86.         merge(node,node->l,node->r);
  87.         free(temp);
  88.     }
  89.     else{
  90.         if (node->val>=key) erase(node->l,key);
  91.         else erase(node->r,key);
  92.     }
  93.     ug(node);
  94. }
  95.  
  96. int main(){
  97. #ifndef ONLINE_JUDGE
  98.     readFile;
  99. //    writeFile;
  100. #endif
  101.     fastIO;
  102.     pnode tree = new treap(0);
  103.     cin>>n;
  104.     while (n--){
  105.         cin>>c>>num;
  106.         if (c=='+'){    
  107.             pnode temp = new treap(num);
  108.             insert(tree,temp);
  109.             if (!g(tree)) cout<<1<<"\n";
  110.             else cout<<g(tree)<<"\n";
  111.         }
  112.         else{
  113.             erase(tree,num);
  114.             if (!g(tree)) cout<<1<<"\n";
  115.             else cout<<g(tree)<<"\n";
  116.         }
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment