求助,WA on #10

P1253 扶苏的问题

zhangzhihao2 @ 2023-10-21 11:46:58

马上上CSP-S考场了,救命!

#include<bits/stdc++.h>
#define int long long
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
const int inf=-1145141919810;
int n,q,arr[1000009],sum[4000009],maxt[4000009],stag[4000009],ctag[4000009];

void pushup(int x){
    maxt[x]=max(maxt[ls],maxt[rs]);
}

void fs(int x,int l,int r,int k){
    stag[x]+=k;
    maxt[x]+=k;
}

void fc(int x,int l,int r,int k){
    stag[x]=0;
    ctag[x]=k;
    maxt[x]=k;
}

void pushdownc(int x,int l,int r){
    if(ctag[x]==inf) return;
    stag[ls]=stag[rs]=0;
    maxt[ls]=maxt[rs]=ctag[ls]=ctag[rs]=ctag[x];
    ctag[x]=inf;
}

void pushdowns(int x,int l,int r){
    if(!stag[x]) return;
    pushdownc(x,l,r);
    stag[ls]+=stag[x],stag[rs]+=stag[x];
    maxt[ls]+=stag[x],maxt[rs]+=stag[x];
    stag[x]=0;
}

void pushdown(int x,int l,int r){
    pushdownc(x,l,r),pushdowns(x,l,r);
}

void build(int x,int l,int r){
    if(l==r){
        maxt[x]=arr[l],ctag[x]=inf;
        return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(x);
}

void add(int x,int l,int r,int ql,int qr,int k){
    if(ql<=l&&qr>=r){
        pushdownc(x,l,r);
        fs(x,l,r,k);
        return;
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(mid>=ql) add(ls,l,mid,ql,qr,k);
    if(mid<qr) add(rs,mid+1,r,ql,qr,k);
    pushup(x);
}

void cover(int x,int l,int r,int ql,int qr,int k){
    if(ql<=l&&qr>=r){
        fc(x,l,r,k);
        return;
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(mid>=ql) cover(ls,l,mid,ql,qr,k);
    if(mid<qr) cover(rs,mid+1,r,ql,qr,k);
    pushup(x);
}

int query(int x,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r) return maxt[x];
    pushdown(x,l,r);
    int mid=(l+r)>>1,res=-1e15;
    if(mid>=ql) res=max(res,query(ls,l,mid,ql,qr));
    if(mid<qr) res=max(res,query(rs,mid+1,r,ql,qr));
    pushup(x);
    return res;
}

int ll,rr,xx;
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++) scanf("%lld",&arr[i]);
    build(1,1,n);
    for(int i=1;i<=n*4;i++) ctag[i]=inf;
    for(int i=1;i<=q;i++){
        int op,l,r,x;
        cin>>op;
        if(op==1){
            scanf("%lld%lld%lld",&ll,&rr,&xx);
            cover(1,1,n,ll,rr,xx);
            // for(int i=1;i<=n;i++){
            //     cout<<query(1,1,n,i,i)<<' ';
            // }
            // cout<<endl;
        }
        else if(op==2){
            scanf("%lld%lld%lld",&ll,&rr,&xx);
            add(1,1,n,ll,rr,xx);
            // for(int i=1;i<=n;i++){
            //     cout<<query(1,1,n,i,i)<<' ';
            // }
            // cout<<endl;
        }
        else{
            scanf("%lld%lld",&ll,&rr);
            cout<<query(1,1,n,ll,rr)<<endl;
        }
    }
    return 0;
}

|