线段树成端更新,据说暴力也能过?
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <set>
#define maxn 110000
#define inf 1<<29
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int tree[maxn<<2];
int col[maxn<<2];
int deng[maxn<<2];
int gcd(int a,int b)
{
while(1)
{
if(b==0)
{
return a;
}
int t=b;
b=a%b;
a=t;
}
}
void pushup(int rt)
{
tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void pushdown(int rt)
{
if(col[rt])
{
col[rt<<1]=col[rt<<1|1]=col[rt];
tree[rt<<1]=tree[rt<<1|1]=tree[rt];
col[rt]=0;
}
if(deng[rt])
{
deng[rt<<1]=deng[rt<<1|1]=deng[rt];
tree[rt<<1]=tree[rt<<1|1]=tree[rt];
deng[rt]=0;
}
}
void build(int l,int r,int rt)
{
col[rt]=deng[rt]=0;
if(r==l)
{
scanf("%d",&tree[rt]);
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update1(int L,int R,int num,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
col[rt]=1;
deng[rt]=1;
tree[rt]=num;
return ;
}
pushdown(rt);
int m=(l+r)>>1;
if(L<=m)
{
update1(L,R,num,lson);
}
if(m<R)
{
update1(L,R,num,rson);
}
pushup(rt);
}
void update2(int L,int R,int num,int l,int r,int rt)
{
if(tree[rt]<num)
{
return ;
}
if(deng[rt]&&L<=l&&r<=R)
{
tree[rt]=gcd(tree[rt],num);
col[rt]=1;
deng[rt]=0;
return ;
}
if(l==r)
{
tree[rt]=gcd(tree[rt],num);
return ;
}
pushdown(rt);
int m=(l+r)>>1;
if(L<=m)
{
update2(L,R,num,lson);
}
if(m<R)
{
update2(L,R,num,rson);
}
pushup(rt);
}
void query(int l,int r,int rt)
{
if(l==r)
{
printf("%d ",tree[rt]);
return ;
}
pushdown(rt);
int m=(l+r)>>1;
query(lson);
query(rson);
}
int main()
{
int t;
int n,q;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&q);
int op,l,r,x;
for(int i=0;i<q;i++)
{
scanf("%d%d%d%d",&op,&l,&r,&x);
if(op==1)
{
update1(l,r,x,1,n,1);
}
else
{
update2(l,r,x,1,n,1);
}
}
query(1,n,1);
cout<<endl;
}
return 0;
}