WA 20 求助

P1253 扶苏的问题

qwq___qaq @ 2021-12-24 00:10:40

#include<bits/stdc++.h>
#define int long long
#define ls k<<1
#define rs k<<1|1
#define inf -1e14
using namespace std;
const int maxn=1e6+5;
int n,m,a[maxn],add[maxn<<2],num[maxn<<2],up[maxn<<2];
inline int read(){
    int res=0,f=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
        f|=(ch=='-'),ch=getchar();
    while(ch>='0'&&ch<='9'){
        res=(res<<1)+(res<<3)+(ch^'0');
        ch=getchar();
    }
    return f?-res:res;
}
void Build(int k,int l,int r){
    up[k]=inf;
    if(l==r){
        num[k]=a[l];
        return;
    }
    int mid=l+r>>1;
    Build(ls,l,mid);
    Build(rs,mid+1,r);
    num[k]=max(num[ls],num[rs]);
}
void pushdown(int k){
    if(add[k]){
        num[ls]+=add[k];
        num[rs]+=up[k];
        add[ls]+=add[k];
        add[rs]+=add[k];
        up[ls]=up[rs]=inf;
        add[k]=0;
    }
}
void modify(int k,int l,int r,int x,int y,int v){
    if(l>=x&&r<=y){
        num[k]+=v;
        up[k]=inf;
        add[k]+=v;
        return;
    }
    int mid=l+r>>1;
    pushdown(k);
    if(x<=mid) modify(ls,l,mid,x,y,v);
    else modify(rs,mid+1,r,x,y,v);
    num[k]=max(num[ls],num[rs]);
}
void Pushdown(int k){
    if(up[k]!=inf){
        num[ls]=up[k];
        num[rs]=up[k];
        add[ls]=add[rs]=0;
        up[ls]=up[rs]=up[k];
        up[k]=inf;
    }
}
void Modify(int k,int l,int r,int x,int y,int v){
    if(x<=l&&r<=y){
        num[k]=v;
        up[k]=v;
        add[k]=0;
        return;
    }
    int mid=l+r>>1;
    Pushdown(k);
    if(x<=mid)
        Modify(ls,l,mid,x,y,v);
    if(y>mid)
        Modify(rs,mid+1,r,x,y,v);
    num[k]=max(num[ls],num[rs]);
}
int query(int k,int l,int r,int x,int y){
    if(l>=x&&r<=y)
        return num[k];
    int mid=l+r>>1,res=inf;
    pushdown(k);
    Pushdown(k);
    if(x<=mid)
        res=max(res,query(ls,l,mid,x,y));
    if(mid<y)
        res=max(res,query(rs,mid+1,r,x,y));
    return res;
}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;++i)
        a[i]=read();
    Build(1,1,n);
    while(m--){
        int op=read(),b=read(),c=read();
        if(op==1)
            Modify(1,1,n,b,c,read());
        else if(op==2)
            modify(1,1,n,b,c,read());
        else
            printf("%lld\n",query(1,1,n,b,c));
    }
    return 0;
}

by OldVagrant @ 2021-12-25 09:42:02

你的P函数没有作用,换成Pushdown


上一页 |