10分求条

P1253 扶苏的问题

Lanpinye_Only @ 2024-10-01 20:16:14

#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define ls p<<1
#define rs p<<1|1
#define inf 1e18
using namespace std;
ll c[N<<2],tag1[N<<2]/*加*/,tag2[N<<2]//覆盖;
int n,m;
inline ll read(){
    int x=0;
    bool f=0;
    char c=getchar();
    while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
    while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return f?-x:x; 
}
inline void up(int p){
    c[p]=max(c[ls],c[rs]);
}
inline void down1(int p){
    if(tag2[p]!=inf){
        tag2[ls]=tag2[rs]=tag2[p];
        c[ls]=c[rs]=tag2[p];
        tag2[p]=inf;
        tag1[ls]=tag1[rs]=0;
    }
    return;
}
inline void down2(int p){
    tag1[ls]+=tag1[p];
    tag1[rs]+=tag1[p];
    c[ls]+=tag1[p];
    c[rs]+=tag1[p];
    tag1[p]=0;
    return;
}
void build(int s,int t,int p){
    tag2[p]=inf;
    if(s==t){
        c[p]=read();
        return;
    }
    ll mid=s+t>>1;
    build(s,mid,ls);
    build(mid+1,t,rs);
    up(p);
}
void add(int l,int r,int s,int t,int p,int k){
    if(s>=l&&r>=t){
        c[p]+=k;
        tag1[p]+=k;
        return;
    }
    ll mid=s+t>>1;
    down1(p);
    down2(p);
    if(l<=mid)add(l,r,s,mid,ls,k);
    if(r>mid)add(l,r,mid+1,t,rs,k);
    up(p);
}
void add2(int l,int r,int s,int t,int p,int k){
    if(s>=l&&r>=t){
        c[p]=k;
        tag2[p]=k;
        tag1[p]=0;
        return;
    }
    ll mid=s+t>>1;
    down1(p);
    down2(p);
    if(l<=mid)add(l,r,s,mid,ls,k);
    if(r>mid)add(l,r,mid+1,t,rs,k);
    up(p);
}
ll query(int l,int r,int s,int t,int p){
    if(s>=l&&t<=r){
        return c[p];
    }
    down1(p);
    down2(p);
    ll mid=s+t>>1,a=-1e8;
    if(l<=mid)a=max(query(l,r,s,mid,ls),a);
    if(r>mid)a=max(query(l,r,mid+1,r,rs),a);
    return a;
}
int main(){
    n=read(),m=read();
    build(1,n,1);
    for(int i=1;i<=m;i++){
        ll op,l,r,x;
        op=read(),l=read(),r=read();
        if(op==1){
            x=read();
            add2(l,r,1,n,1,x);
        }
        else if(op==2){
            x=read();
            add(l,r,1,n,1,x);
        }
        else{
            cout<<query(l,r,1,n,1)<<"\n";
        }
    }
} 

|