大佬求调!!!

P1253 扶苏的问题

Angel_D @ 2024-11-14 15:54:16

#include<bits/stdc++.h>
#define int long long
#define lf(x) (x)<<1
#define rt(x) (x)<<1|1
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
struct node{
    int lft,rgt,val,add,change,flag;
};
int const N=1e6+1;
node pos[N*4];
int a[N];

struct code{
    int val,fl;
};
void pushup(int u){
    pos[u].val=max(pos[lf(u)].val,pos[rt(u)].val);
    return;
}
void build(int u,int l,int r){
    pos[u].lft=l,pos[u].rgt=r;
    if(l==r){
        pos[u].val=a[l];
        return;
    }
    else{
        int mid=(l+r)>>1;
        build(lf(u),l,mid);
        build(rt(u),mid+1,r);
        pushup(u);
    }
    return;
}
void mt_add(int u,int v){
    pos[u].val+=v;
    pos[u].add+=v;
    return;
}
void mt_change(int u,int v){
    pos[u].val=v;
    pos[u].add=0;
    pos[u].change=v;
    pos[u].flag=1;
    return;
}
void pushdown(int u){
    if(pos[u].flag){
        mt_change(lf(u),pos[u].change);
        mt_change(rt(u),pos[u].change);
        pos[u].flag=0;
    }
    else if(pos[u].add!=0){
        mt_add(lf(u),pos[u].add);
        mt_add(rt(u),pos[u].add);
        pos[u].add=0;
    }
    return;
}
void update(int u,int L,int R,int add_v,int change_v,int fl){
    if(pos[u].lft>=L&&pos[u].rgt<=R){
        if(fl){
            mt_change(u,change_v);
        }
        if(add_v!=0){
            mt_add(u,add_v);
        }
        return;
    }
    else if(!(pos[u].lft>R||pos[u].rgt<L)){
        pushdown(u);
        update(lf(u),L,R,add_v,change_v,fl);
        update(rt(u),L,R,add_v,change_v,fl);
        pushup(u);
    }
    return;
}
int query(int u,int L,int R){
    if(pos[u].lft>=L&&pos[u].rgt<=R){
        return pos[u].val;
    }
    else if(!(pos[u].lft>R||pos[u].rgt<L)){
        int mid=(L+R)>>1;
        pushdown(u);
        return max(query(rt(u),L,R),query(lf(u),L,R));
    }
    return -(1LL<<60);
}
int n,q;
signed main(){
    IOS;
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(q--){
        int op;
        cin>>op;
        if(op==1){
            int ll,rr,x;
            cin>>ll>>rr>>x;
            update(1,ll,rr,0,x,1);
        }
        else if(op==2){
            int ll,rr,x;
            cin>>ll>>rr>>x;
            update(1,ll,rr,x,0,0);
        }
        else if(op==3){
            int ll,rr;
            cin>>ll>>rr;
            cout<<query(1,ll,rr)<<"\n";
        }
    }
    return 0;
}
/*
6 6
1 1 4 5 1 4
1 1 2 6
2 3 4 2
3 1 4
3 2 3
1 1 6 -1
3 1 6
*/

|