http://acm.hdu.edu.cn/showproblem.php?pid=4902
线段树 区间更新 模板题
#include<bits/stdc++.h> using namespace std; #define N 100005 #define mid (l+r)/2 #define lc (rt<<1) #define rc (rt<<1|1) int T[N<<2],lazy[N<<2]; void up(int rt){ T[rt] = max(T[lc],T[rc]); } int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } void down(int rt){ if(lazy[rt] != -1){ lazy[lc]=lazy[rc]=lazy[rt]; T[lc]=T[rc]=T[rt]; lazy[rt]=-1; } } void build(int l,int r,int rt){ lazy[rt] = -1; if(l == r){ scanf("%d",&T[rt]); lazy[rt] = T[rt]; return ; } build(l,mid,lc); build(mid+1,r,rc); up(rt); } void update(int l,int r,int L,int R,int id,int x,int rt){ if(L <= l && r <= R){ if(id == 1){ lazy[rt]=x; T[rt] = x; return ; } else { if(lazy[rt] != -1){ if(lazy[rt] > x) { lazy[rt] = gcd(lazy[rt],x); T[rt] = lazy[rt]; } return ; }//如果不等于1的话 还是要进行后面的继续查询 } } down(rt); if(L <= mid)update(l,mid,L,R,id,x,lc); if(R > mid )update(mid+1,r,L,R,id,x,rc); up(rt); } void out(int l,int r,int rt) { if(lazy[rt] != -1){ for(int i=l;i<=r;i++){ printf("%d ",T[rt]); } return ; } if(l == r){ printf("%d ",&T[rt]); return ; } down(rt); out(l,mid,lc); out(mid+1,r,rc); } int main () { int t; scanf("%d",&t); while (t--){ int n,m; scanf("%d",&n); build(1,n,1); scanf("%d",&m); for(int i=1;i<=m;i++) { int id,l,r,x; scanf("%d %d %d %d",&id,&l,&r,&x); update(1,n,l,r,id,x,1); } out(1,n,1); puts(""); } return 0; }