思路:线段树各种lazy操作即可。
#include
#include
#include
#include
using namespace std;
struct node
{
int l,r;
int b;
long long a;
} t[500000];
long long aa[111111];
int n,m;
void build(int ll,int rr,int rot)
{
t[rot].l=ll;
t[rot].r=rr;
if(ll==rr)
{
t[rot].a=aa[ll];
t[rot].b=1;
return;
}
t[rot].b=0;
int mid=(ll+rr)/2;
build(ll,mid,rot<<1);
build(mid+1,rr,rot<<1|1);
}
void pushdown(int rot)
{
if(t[rot].b==1)
{
t[rot<<1].a=t[rot].a;
t[rot<<1].b=1;
t[rot<<1|1].a=t[rot].a;
t[rot<<1|1].b=1;
}
else
{
if(t[rot<<1].b==0)
{
t[rot<<1].b=t[rot].b;
t[rot<<1].a=t[rot].a;
}
else if(t[rot<<1].b==1)
{
if(t[rot<<1].a>t[rot].a)
{
if(t[rot].a==0)t[rot<<1].a=0;
else t[rot<<1].a=__gcd(t[rot].a,t[rot<<1].a);
}
}
else if(t[rot<<1].b==2)
{
pushdown(rot<<1);
t[rot<<1].b=t[rot].b;
t[rot<<1].a=t[rot].a;
}
if(t[rot<<1|1].b==0)
{
t[rot<<1|1].b=t[rot].b;
t[rot<<1|1].a=t[rot].a;
}
else if(t[rot<<1|1].b==1)
{
if(t[rot<<1|1].a>t[rot].a)
{
if(t[rot].a==0)t[rot<<1|1].a=0;
else t[rot<<1|1].a=__gcd(t[rot].a,t[rot<<1|1].a);
}
}
else if(t[rot<<1|1].b==2)
{
pushdown(rot<<1|1);
t[rot<<1|1].b=t[rot].b;
t[rot<<1|1].a=t[rot].a;
}
}
t[rot].b=0;
}
void update(int u,int ll,int rr,long long x,int rot)
{
if(t[rot].l==ll&&t[rot].r==rr)
{
if(u==1)
{
t[rot].a=x;
t[rot].b=u;
}
else
{
if(t[rot].b==1)
{
if(t[rot].a>x)
{
if(x==0)t[rot].a=0;
else t[rot].a=__gcd(t[rot].a,x);
}
}
else
{
if(t[rot].b==2)pushdown(rot);
t[rot].a=x;
t[rot].b=u;
}
}
return;
}
if(t[rot].b)pushdown(rot);
int mid=(t[rot].l+t[rot].r)/2;
if(rr<=mid)update(u,ll,rr,x,rot<<1);
else if(ll>mid)update(u,ll,rr,x,rot<<1|1);
else
{
update(u,ll,mid,x,rot<<1);
update(u,mid+1,rr,x,rot<<1|1);
}
}
void query(int rot)
{
if(t[rot].b==1)
{
for(int i=t[rot].l; i<=t[rot].r; i++)printf("%I64d ",t[rot].a);
return;
}
if(t[rot].b==2)pushdown(rot);
query(rot<<1);
query(rot<<1|1);
}
int main()
{
int l,r,u;
long long v;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)scanf("%I64d",&aa[i]);
build(1,n,1);
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d%I64d",&u,&l,&r,&v);
update(u,l,r,v,1);
}
query(1);
printf("\n");
}
return 0;
}