深进做法求改

P1253 扶苏的问题

better_Z @ 2024-04-13 21:33:31

#include<iostream>
#include<cmath>
using namespace std;
#define maxn 1000010
#define ll long long
#define inf 1000000000ll
ll w[maxn*4],lzy_add[maxn*4],lzy_set[maxn*4],a[maxn];
int ans;
void pushup(int u){w[u]=max(w[u*2],w[u*2+1]);}
void build(int u,int l,int r){
    if(l==r){
        w[l]=a[l];
    }
    int m=(l+r)>>1;
    build(u*2,l,m);build(u*2+1,m+1,r);
    lzy_set[u]=inf;
    pushup(u);
}
void maketag(int u,ll x,int type){
    if(type==1){
        lzy_add[u]=0;lzy_set[u]=x;w[u]=x;
    }
    else{
        if(lzy_set[u]==inf)lzy_add[u]+=x;
        else lzy_set[u]+=x;
        w[u]+=x;
    }
}
void pushdown(int u){
    if(lzy_set[u]==inf){
        maketag(u*2,lzy_add[u],2);
        maketag(u*2+1,lzy_add[u],2);
        lzy_add[u]=0;
    }
    else{
        maketag(u*2,lzy_set[u],1);
        maketag(u*2+1,lzy_set[u],1);
        lzy_set[u]=inf;
    }
}
void update(int u,int ql,int qr,int l,int r,ll x,int type){
    if(ql>=l&&r>=qr)maketag(u,x,type);
    pushdown(u);
    int m=(l+r)>>1;
    if(l<=m)update(u*2,ql,m,l,r,x,type);
    if(r>=m)update(u*2+1,m+1,qr,l,r,x,type);
    pushup(u);
}
ll query(int u,int ql,int qr,int l,int r){
    if(ql>=l&&r>=qr)return w[u];
    pushdown(u);
    int m=(l+r)>>1;
    if(l<=m)ans=max(static_cast<long long>(ans),static_cast<long long>(query(u*2,ql,m,l,r)));
    if(r>=m)ans=max(static_cast<long long>(ans),static_cast<long long>(query(u*2+1,m+1,qr,l,r)));
    return ans;
}
int main(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    for(int i=1,op;i<=q;i++){
        int l,r,x;
        cin>>op;
        if(op==1){
            cin>>l>>r>>x;
            update(1,1,n,l,r,x,1);
        }else if(op==2){
            cin>>l>>r>>x;
            update(1,1,n,l,r,x,2);
        }else{
            cin>>l>>r;
            cout<<query(1,1,n,l,r);
            cout<<endl;
        }
    }
    return 0;
}

|