50分求助,测试点6~10都WA

P1253 扶苏的问题

Lemon_City @ 2023-07-28 10:45:19

#include<iostream>
long long max(long long a,long long b){
    return (a>b)?a:b;
}
using namespace std;
const int N=1e6+10;
#define Inf 100000000000ll
long long lzys[4*N],lzya[4*N],a[N],w[4*N];
void pushup(int u){
    w[u]=max(w[(u<<1)],w[(u<<1)+1]);
}
void build(int u,int l,int r){
    if(l==r){
        w[u]=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}
bool InRange(int L,int R,int l,int r){
    return (L>=l)&&(R<=r);
}
bool OutRange(int L,int R,int l,int r){
    return (L>r)||(R<l);
}
void maketags(int u,int x){
    w[u]=x;
    lzya[u]=0;
    lzys[u]=x;
}
void maketaga(int u,int x){
    w[u]+=x;
    (lzys[u]==Inf)?lzya[u]+=x:lzys[u]+=x;
}
void pushdown(int u){
    if(lzys[u]==Inf){
        maketaga(u*2,lzya[u]);
        maketaga(u*2+1,lzya[u]);
        lzya[u]=0;
    }else{
        maketags(u*2,lzys[u]);
        maketags(u*2+1,lzys[u]);
        lzys[u]=Inf;
    }
}
void updatea(int u,int L,int R,int l,int r,int x){
    if(InRange(L,R,l,r)){
        maketaga(u,x);
    }else if(!OutRange(L,R,l,r)){
        int mid=(L+R)>>1;
        pushdown(u);
        updatea(u*2,L,mid,l,r,x);
        updatea(u*2+1,mid+1,R,l,r,x);
        pushup(u);
    }else return;
}
void updates(int u,int L,int R,int l,int r,int x){
    if(InRange(L,R,l,r)){
        maketags(u,x);
    }else if(!OutRange(L,R,l,r)){
        int mid=(L+R)>>1;
        pushdown(u);
        updates(u*2,L,mid,l,r,x);
        updates(u*2+1,mid+1,R,l,r,x);
        pushup(u);
    }else return;
}
long long query(int u,int L,int R,int l,int r){
    if(InRange(L,R,l,r)){
        return w[u];
    }else if(!OutRange(L,R,l,r)){
        int mid=(L+R)>>1;
        pushdown(u);
        return max(query(u*2,L,mid,l,r),query(u*2+1,mid+1,R,l,r));
    }else return -Inf;
}
int main(){
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}
    for(int i=1;i<=4*n;i++){lzys[i]=Inf;}
    build(1,1,n);
    for(int i=1;i<=q;i++){
        long long opt,l,r,x;
        scanf("%lld",&opt);
        if(opt==1){
            scanf("%lld%lld%lld",&l,&r,&x);
            updates(1,1,n,l,r,x);
        }else if(opt==2){
            scanf("%lld%lld%lld",&l,&r,&x);
            updatea(1,1,n,l,r,x);
        }else{
            scanf("%lld%lld",&l,&r);
            printf("%lld\n",query(1,1,n,l,r));
        }
    }
    return 0;
}

|