hdu4902

来源:互联网 发布:淘宝上货最少几件 编辑:程序博客网 时间:2024/06/07 06:05

思路:线段树各种lazy操作即可。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>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;}


0 0