题目:http://acm.hdu.edu.cn/showproblem.php?pid=4902
1 10 16807 282475249 1622650073 984943658 1144108930 470211272 101027544 1457850878 1458777923 2007237709 10 1 3 6 74243042 2 4 8 16531729 1 3 4 1474833169 2 1 8 1131570933 2 7 9 1505795335 2 3 7 101929267 1 4 10 1624379149 2 2 8 2110010672 2 6 7 156091745 1 2 5 937186357
16807 937186357 937186357 937186357 937186357 1 1 1624379149 1624379149 1624379149
#include <iostream> #include <cstdio> using namespace std; #define lt 2*root #define rt 2*root+1 const int maxn=1e5+10; struct node{ int l,r,val,tag; int mid(){ return (l+r)/2; } }tr[maxn*3]; void build(int root,int ll,int rr){ tr[root].l=ll; tr[root].r=rr; tr[root].val=0; tr[root].tag=-1; if(ll==rr) return ; int m=tr[root].mid(); build(lt,ll,m); build(rt,m+1,rr); } void insert(int root,int dex,int val){ if(tr[root].l==tr[root].r) { tr[root].val=val; return ; } int m=tr[root].mid(); if(dex<=m) insert(lt,dex,val); //<= !! else insert(rt,dex,val); } void update1(int root,int ll,int rr,int x){ if(ll==tr[root].l&&rr==tr[root].r){ tr[root].val=x; tr[root].tag=1; //这一区间全是一样的数字 return ; } if(tr[root].tag!=-1){ tr[lt].tag=tr[root].tag; tr[lt].val=tr[root].val; tr[rt].tag=tr[root].tag; tr[rt].val=tr[root].val; tr[root].tag=-1; tr[root].val=0; } int m=tr[root].mid(); if(ll>m) update1(rt,ll,rr,x); else if(rr<=m) update1(lt,ll,rr,x); else { update1(lt,ll,m,x); update1(rt,m+1,rr,x); } } int gcd(int a,int b){ if(a==0) return b; return b?gcd(b,a%b):a; } void update2(int root,int ll,int rr,int x){ if(ll==tr[root].l&&rr==tr[root].r&&tr[root].tag!=-1){ if(tr[root].val>x)tr[root].val=gcd(tr[root].val,x); return ; } if(tr[root].l==tr[root].r){ if(tr[root].val>x)tr[root].val=gcd(tr[root].val,x); return ; } if(tr[root].tag!=-1){ tr[lt].tag=tr[root].tag; tr[lt].val=tr[root].val; tr[rt].tag=tr[root].tag; tr[rt].val=tr[root].val; tr[root].tag=-1; } int m=tr[root].mid(); if(ll>m) update2(rt,ll,rr,x); else if(rr<=m) update2(lt,ll,rr,x); else { update2(lt,ll,m,x); update2(rt,m+1,rr,x); } } int psum; void print(int root,int dex){ if(tr[root].l!=tr[root].r&&tr[root].tag!=-1){ int length=tr[root].r-tr[root].l+1; for(int i=0;i<length;i++) printf("%d ",tr[root].val); psum=psum+length; return ; } if(tr[root].l==tr[root].r){ printf("%d ",tr[root].val); psum++; return ; } int m=tr[root].mid(); if(dex<=m) print(lt,dex); //<= !! 左子树包含着mid else print(rt,dex); } int main() { //freopen("cin.txt","r",stdin); int T,n,a,q; cin>>T; while(T--){ scanf("%d",&n); build(1,1,n); for(int i=1;i<=n;i++){ scanf("%d",&a); insert(1,i,a); } scanf("%d",&q); int t,l,r,x,i; for(i=0;i<q;i++){ scanf("%d%d%d%d",&t,&l,&r,&x); if(t==1) update1(1,l,r,x); else update2(1,l,r,x); } for(psum=0;psum<n;){ //psum 自己在不断增加 print(1,psum+1); } puts(""); } return 0; }