Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const long long mod = 1e9 + 7;
- const double eps = 1e-15;
- const double PI = atan(1.0);
- #define readFile freopen("input","r",stdin)
- #define writeFile freopen("output","w",stdout)
- #define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
- typedef pair<int,long long> ii;
- typedef unsigned long long ULL;
- const int N = 1001;
- char c;
- int n,num;
- int gcd(int a,int b){
- return b?gcd(b,a%b):a;
- }
- struct genn{
- private:
- ULL x,y,z,w,t;
- public:
- genn(){
- x=1,y=2,z=3,w=4;
- }
- ULL next(){
- t = x^(x<<15);
- x=y,y=z,z=w;
- return w = w^(w>>18)^t^(t>>9);
- }
- };
- genn gen = genn();
- struct treap{
- treap *l,*r;
- ULL p;
- int val;
- int gg;
- treap(){l = r = NULL;}
- treap(int val){
- p = gen.next();
- this->val = gg = val;
- l = r = NULL;
- }
- };
- #define pnode treap*
- int g(pnode node){
- return node?node->gg:0;
- }
- void ug(pnode node){
- if (node){
- node->gg = gcd(node->val,gcd(g(node->l),g(node->r)));
- }
- }
- void split(pnode node,pnode &l,pnode &r,int key){
- if (!node) l = r = NULL;
- else if (node->val <= key) split(node->r,node->r,r,key),l = node;
- else split(node->l,l,node->l,key),r = node;
- ug(node);
- }
- void merge(pnode &node,pnode l,pnode r){
- if (!l||!r) node = l?l:r;
- else if (l->p>r->p){
- merge(l->r,l->r,r),node = l;
- }
- else {
- merge(r->l,l,r->l),node = r;
- }
- ug(node);
- }
- void insert(pnode &node,pnode &ins){
- if (!node) node = ins;
- else if (node->p<ins->p) split(node,ins->l,ins->r,ins->val),node = ins;
- else {
- if (ins->val<=node->val) insert(node->l,ins);
- else insert(node->r,ins);
- }
- ug(node);
- }
- void erase(pnode &node,int key){
- if (!node) return;
- if (node->val == key){
- pnode temp = node;
- merge(node,node->l,node->r);
- free(temp);
- }
- else{
- if (node->val>=key) erase(node->l,key);
- else erase(node->r,key);
- }
- ug(node);
- }
- int main(){
- #ifndef ONLINE_JUDGE
- readFile;
- // writeFile;
- #endif
- fastIO;
- pnode tree = new treap(0);
- cin>>n;
- while (n--){
- cin>>c>>num;
- if (c=='+'){
- pnode temp = new treap(num);
- insert(tree,temp);
- if (!g(tree)) cout<<1<<"\n";
- else cout<<g(tree)<<"\n";
- }
- else{
- erase(tree,num);
- if (!g(tree)) cout<<1<<"\n";
- else cout<<g(tree)<<"\n";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment