20PTS求调!!!

P1253 扶苏的问题

_liuyiqin @ 2024-12-09 20:24:26

#include<bits/stdc++.h>
using namespace std;
const int N(1e6+5);
#define int long long
int n,q;
int a[N];
struct node{
    int l,r,ma=-1e18;
    int tag,val=-1e18;
}t[N<<2];
inline void build(int p,int l,int r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].ma=a[l];
        return;
    }
    int mid=l+r>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
    return ;
}
inline void pushdown_1(int p){
    if(t[p].val!=-1e18){
        t[p<<1].ma=t[p].val,t[p<<1|1].ma=t[p].val; 
        t[p<<1].val=t[p].val,t[p<<1|1].val=t[p].val;
        t[p].val=-1e18,t[p].tag=0;  
    }
    return ;
}
inline void pushdown_2(int p){
    if(t[p].tag){
        t[p<<1].ma+=t[p].tag,t[p<<1|1].ma+=t[p].tag; 
        t[p<<1].tag+=t[p].tag,t[p<<1|1].tag+=t[p].tag;
        t[p].tag=0; 
    }
    return ;
}
inline void modify_1(int p,int l,int r,int x){
    if(l<=t[p].l&&r>=t[p].r){
        t[p].val=x;
        t[p].ma=x;
        t[p].tag=0;
        return;
    }
    pushdown_1(p);
    int mid=(t[p].l+t[p].r)>>1;
    if(l<=mid) modify_1(p<<1,l,mid,x);
    if(r>mid) modify_1(p<<1|1,mid+1,r,x);
    t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
    return;
}
inline void modify_2(int p,int l,int r,int x){
    if(l<=t[p].l&&r>=t[p].r){
        t[p].tag+=x;
        t[p].ma+=x;
        return;
    }
    pushdown_2(p);
    int mid=t[p].l+t[p].r>>1;
    if(l<=mid) modify_2(p<<1,l,mid,x);
    if(r>mid) modify_2(p<<1|1,mid+1,r,x);
    t[p].ma=max(t[p<<1].ma,t[p<<1|1].ma);
    return;
}
inline int query(int p,int l,int r){
    if(l<=t[p].l&&r>=t[p].r) return t[p].ma;
    pushdown_1(p);
    pushdown_2(p); 
    int mid=t[p].l+t[p].r>>1;
    int ans=-2e9;
    if(l<=mid) ans=max(ans,query(p<<1,l,r));
    if(r>mid) ans=max(ans,query(p<<1|1,l,r));
    return ans;
}
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i]; 
    }
    build(1,1,n);
    while(q--){
        int op,l,r,x;
        cin>>op>>l>>r;
        if(op==1){
            cin>>x;
            modify_1(1,l,r,x);
        }
        else if(op==2){
            cin>>x;
            modify_2(1,l,r,x);
        }
        else if(op==3){
            cout<<query(1,l,r)<<endl;
        }
    }
    return 0;
}

|