50pt求调

P1253 扶苏的问题

pioneer2000 @ 2024-12-15 18:37:23

请谅解码风

#include<bits/stdc++.h>
#define ll long long
#define ls (p<<1)
#define rs ((p<<1)|1)
#define mid ((l+r)>>1)
using namespace std;
const int N=1e6+5;
ll n,q,a[N],op;
struct Tree{
    int sum,lz_add,tg,fl;
}tr[N<<2];
void push_up(ll p,ll l,ll r){
    tr[p].sum=max(tr[ls].sum,tr[rs].sum);
}
void push_down(ll p){
    if(tr[p].fl){
        tr[ls].sum=tr[p].tg;
        tr[rs].sum=tr[p].tg;
        tr[ls].lz_add=0;
        tr[rs].lz_add=0;
        tr[ls].tg=tr[p].tg;
        tr[rs].tg=tr[p].tg;
        tr[ls].fl=1;
        tr[rs].fl=1;
        tr[p].tg=0;
        tr[p].fl=0;
    }else{
        tr[ls].sum+=tr[p].lz_add;
        tr[rs].sum+=tr[p].lz_add;
        tr[ls].lz_add+=tr[p].lz_add;
        tr[rs].lz_add+=tr[p].lz_add;
        tr[p].lz_add=0;
    }
}
void build(ll l,ll r,ll p){
    if(l==r){
        tr[p].sum=a[l];
        return ;
    }
    build(l,mid,ls);
    build(mid+1,r,rs);
    push_up(p,l,r);
}
ll query(ll l,ll r,ll le,ll ri,ll p){
    if(l==le&&r==ri){
        return tr[p].sum;
    }
    push_down(p);
    ll ret=-2e16;
    if(ri<=mid) ret=query(l,mid,le,ri,ls);
    else if(le>mid) ret=query(mid+1,r,le,ri,rs);
    else ret=max(query(l,mid,le,mid,ls),query(mid+1,r,mid+1,ri,rs));
    return ret;
}
void add(ll l,ll r,ll le,ll ri,ll p,ll v){
    if(l==le&&r==ri){
        tr[p].sum+=v;
        tr[p].lz_add+=v;
        return ;
    }
    push_down(p);
    if(ri<=mid) add(l,mid,le,ri,ls,v);
    else if(le>mid) add(mid+1,r,le,ri,rs,v);
    else add(l,mid,le,mid,ls,v),add(mid+1,r,mid+1,ri,rs,v);
    push_up(p,l,r);
}
void update(ll l,ll r,ll le,ll ri,ll p,ll v){
    if(l==le&&r==ri){
        tr[p].sum=v;
        tr[p].lz_add=0;
        tr[p].tg=v;
        tr[p].fl=1;
        return ;
    }
    push_down(p);
    if(ri<=mid) update(l,mid,le,ri,ls,v);
    else if(le>mid) update(mid+1,r,le,ri,rs,v);
    else update(l,mid,le,mid,ls,v),update(mid+1,r,mid+1,ri,rs,v);
    push_up(p,l,r);
}
int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    while(q--){
        cin>>op;
        if(op==1){
            ll x,y,v;
            cin>>x>>y>>v;
            update(1,n,x,y,1,v);
        }else if(op==2){
            ll x,y,v;
            cin>>x>>y>>v;
            add(1,n,x,y,1,v);
        }else{
            ll x,y;
            cin>>x>>y;
            cout<<query(1,n,x,y,1)<<endl;
        }
    }
    return 0;
}

by pioneer2000 @ 2024-12-20 08:23:57

已解决


|