首页 > 代码库 > 未完成代码存档

未完成代码存档

#include <cstdio>#define Max 100000typedef long long LL;struct node{    LL l,r,dis,flag,Min_value,Max_value,set,time_set,time_add;}tr[Max<<2];int max(LL a,LL b){return a>b?a:b;}int min(LL a,LL b){return a>b?b:a;} LL n,m,Time;void up(LL k){    tr[k].dis=tr[k<<1].dis+tr[k<<1|1].dis;    tr[k].Max_value=max(tr[k<<1].Max_value,tr[k<<1|1].Max_value);    tr[k].Min_value=min(tr[k<<1].Min_value,tr[k<<1|1].Min_value);}void build(LL k,LL l,LL r){    tr[k].l=l;tr[k].r=r;    if(l==r)    {        scanf("%lld",&tr[k].dis);        tr[k].Max_value=tr[k].dis;        tr[k].Min_value=tr[k].dis;        return;    }    LL mid=(tr[k].l+tr[k].r)>>1;    build(k<<1,l,mid);    build(k<<1|1,mid+1,r);    up(k);}void section_add(int k,int l,int r,int v){    if(tr[k].l==l&&tr[k].r==r)    {        tr[k].dis+=(r-l+1)*v;        tr[k].flag+=v;        tr[k].time_add=++Time;        return;    }    int mid=(tr[k].l+tr[k].r )>>1;    if(l>mid) section_add(k<<1|1,l,r,v);    else if(r<=mid) section_add(k<<1,l,r,v);    else section_add(k<<1,l,mid,v),section_add(k<<1|1,mid+1,r,v);    up(k);}void section_set(int k,int l,int r,int v){    if(tr[k].l==l&&tr[k].r==r)    {        tr[k].dis=(r-l)*v;        tr[k].set=v;        tr[k].time_set=++Time;        return;    }    int mid=(tr[k].l+tr[k].r)>>1;    if(l>mid) section_set(k<<1|1,l,r,v);    else if(r<=mid) section_set(k<<1,l,r,v);    else section_set(k<<1,l,mid,v),section_set(k<<1|1,mid+1,r,v);    up(k);}void pushdown(LL k){    if(tr[k].l==tr[k].r) return;    if(tr[k].time_add<tr[k].time_set)    {        tr[k<<1].set=tr[k].set;        tr[k<<1|1].set=tr[k].set;        tr[k<<1].dis=tr[k].set*(tr[k<<1].r-tr[k<<1].l+1);        tr[k<<1|1].dis=tr[k].set*(tr[k<<1|1].r-tr[k<<1|1].l+1);        tr[k<<1].time_set=tr[k].time_set;        tr[k<<1|1].time_set=tr[k].time_set;        tr[k<<1].time_add=tr[k].time_add;        tr[k<<1|1].time_add=tr[k].time_add;        tr[k].set=0;        tr[k].flag=0;        tr[k].time_add=0;        tr[k].time_set=0;    }    if(tr[k].time_set<tr[k].time_add)    {        tr[k<<1].set=tr[k].set;        tr[k<<1|1].set=tr[k].set;        tr[k<<1].dis=tr[k].set*(tr[k<<1].r-tr[k<<1].l+1);        tr[k<<1|1].dis=tr[k].set*(tr[k<<1|1].r-tr[k<<1|1].l+1);        tr[k<<1].time_set=tr[k].time_set;        tr[k<<1|1].time_set=tr[k].time_set;        tr[k<<1].time_add=tr[k].time_add;        tr[k<<1|1].time_add=tr[k].time_add;        tr[k<<1].dis+=tr[k].flag*(tr[k<<1].r-tr[k<<1].l+1);        tr[k<<1|1].dis+=tr[k].flag*(tr[k<<1|1].r-tr[k<<1|1].l+1);        tr[k].set=0;        tr[k].flag=0;        tr[k].time_add=0;        tr[k].time_set=0;    }}LL query(LL k,LL l,LL r){    if(tr[k].l==l&&tr[k].r==r) return tr[k].dis;    if(tr[k].flag||tr[k].set) pushdown(k);    LL mid=(tr[k].l+tr[k].r)>>1;    if(l>mid) return query(k<<1|1,l,r);    else if(r<=mid) return query(k<<1,l,r);    else return query(k<<1,l,mid)+query(k<<1|1,mid+1,r);    up(k);}LL query_max(LL k,LL l,LL r){    if(tr[k].l==l&&tr[k].r==r) return tr[k].Max_value;    if(tr[k].flag||tr[k].set) pushdown(k);    LL mid=(tr[k].l+tr[k].r)>>1;    if(l>mid) return query_max(k<<1|1,l,r);    else if(r<=mid) return  query_max(k<<1,l,r);    else return max(query_max(k<<1,l,mid),query_max(k<<1|1,mid+1,r));    up(k);}LL query_min(LL k,LL l,LL r){    if(tr[k].l==l&&tr[k].r==r) return tr[k].Min_value;    if(tr[k].flag||tr[k].set) pushdown(k);    LL mid=(tr[k].l+tr[k].r)>>1;    if(l>mid) return query_min(k<<1|1,l,r);    else if(r<=mid) return  query_min(k<<1,l,r);    else return min(query_min(k<<1,l,mid),query_min(k<<1|1,mid+1,r));    up(k);}int main(){    scanf("%lld%lld",&n,&m);    build(1,1,n);    char str[4];    for(int x,y,z;m--;)    {        scanf("%s",str+1);        if(str[1]==a)        {            scanf("%lld%lld%lld",&x,&y,&z);            section_add(1,x,y,z);        }        else if(str[1]==s)        {            if(str[2]==e)            {                scanf("%lld%lld%lld",&x,&y,&z);                section_set(1,x,y,z);            }            else if(str[2]==u)            {                scanf("%lld%lld",&x,&y);                printf("%lld\n",query(1,x,y));            }        }        else if(str[1]==m)        {            scanf("%lld%lld",&x,&y);            if(str[2]==a)                printf("%lld\n",query_max(1,x,y));            else if(str[2]==i)                printf("%lld\n",query_min(1,x,y));        }    }    return 0; }/*10 63 9 2 8 1 7 5 0 4 6add 4 9 4set 2 6 2add 3 8 2sum 2 10max 1 7min 3 6*/

 

未完成代码存档