1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| #include <cstdio> #include <cstdlib> #include <algorithm> #define F(n) Fi(i,n) #define Fi(i,n) for(int i=0;i<n;i++) #define LL long long using namespace std; struct Treap{ Treap *l,*r; int key,pri; LL val,g; Treap(){} Treap(int _k,LL _v):l(NULL),r(NULL),key(_k),val(_v),g(_v),pri(rand()){} }; inline LL get_g(Treap *a){ return a?a->g:0; } inline void pull(Treap *a){ a->g=__gcd(a->val,__gcd(get_g(a->l),get_g(a->r))); } Treap* merge(Treap *a,Treap *b){ if(!a||!b)return a?a:b; if(a->pri > b->pri){ a->r=merge(a->r,b); pull(a); return a; }else{ b->l=merge(a,b->l); pull(b); return b; } } void split(Treap *t,int k,Treap *&a,Treap *&b){ if(!t)a=b=NULL; else if(t->key<=k){ a=t; split(t->r,k,a->r,b); pull(a); }else{ b=t; split(t->l,k,a,b->l); pull(b); } } bool update(Treap *a,int k,LL x){ if(!a)return 0; if(a->key==k)a->val=x,x=1; else if(a->key > k)x=update(a->l,k,x); else x=update(a->r,k,x); pull(a); return x; } LL Tquery(Treap *&a,int k){ if(!a)return 0; if(a->key==k)return a->val; else if(a->key > k)return Tquery(a->l,k); else return Tquery(a->r,k); } inline LL queryLR(Treap *&a,int l,int r){ if(!a)return 0; Treap *lt,*rt; split(a,l-1,lt,a); split(a,r,a,rt); LL ans=a?a->g:0; a=merge(lt,merge(a,rt)); return ans; } inline void Tinsert(Treap *&a,int k,LL x){ if(update(a,k,x))return; Treap *tmp,*tt; split(a,k,a,tmp); a=merge(a,merge(new Treap(k,x),tmp)); } struct SegSeg{ Treap *val; SegSeg *lt,*rt; SegSeg():lt(NULL),rt(NULL),val(NULL){} void insert(int l,int r,int x,int y,LL k){ if(l==r){ if(!val)val=new Treap(y,k); else Tinsert(val,y,k); return; } if(x<=(l+r)/2){ if(!lt)lt=new SegSeg(); lt->insert(l,(l+r)/2,x,y,k); }else{ if(!rt)rt=new SegSeg(); rt->insert((l+r)/2+1,r,x,y,k); } if(!val)val=new Treap(y,__gcd((lt?Tquery(lt->val,y):0),(rt?Tquery(rt->val,y):0))); else Tinsert(val,y,__gcd((lt?Tquery(lt->val,y):0),(rt?Tquery(rt->val,y):0))); } LL query(int l,int r,int a,int b,int x,int y){ if(a<=l&&r<=b)return queryLR(val,x,y); if(l>b||r<a)return 0; int mid=(l+r)/2; return __gcd((lt?lt->query(l,mid,a,b,x,y):0),(rt?rt->query(mid+1,r,a,b,x,y):0)); } }; int main(){ srand(7122); int r,n,a,b,c,d; LL k; scanf("%d%d%d",&r,&c,&n); SegSeg *segseg=new SegSeg(); F(n){ scanf("%d",&a); if(a==1){ scanf("%d%d%lld",&a,&b,&k); segseg->insert(0,r-1,a,b,k); }else{ scanf("%d%d%d%d",&a,&b,&c,&d); if(a>c)swap(a,c); if(b>d)swap(b,d); printf("%lld\n",segseg->query(0,r-1,a,c,b,d)); } } scanf("%*d"); }
|