线段树求调,玄关
查看原帖
线段树求调,玄关
995853
lwxxs楼主2024/4/5 13:23
#include<cstring>
#include<iostream>
#include<algorithm>
#include<limits.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int inf=1e9+10;
int n,m;
ll w[N];
struct node{
    int l,r;
    ll add;
    int reset;
    ll maxv;
}tr[N*4];
void pushup(int u){
    tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);
}
void pushdown(int u){
    if(tr[u].add){
       if(tr[u<<1].reset!=inf){
           tr[u<<1].reset+=tr[u].add;
           tr[u<<1].maxv=tr[u<<1].reset;
       }
       else{
           tr[u<<1].add+=tr[u].add;
           tr[u<<1].maxv+=tr[u].add;
       }
       if(tr[u<<1|1].reset!=inf){
           tr[u<<1|1].reset+=tr[u].add;
           tr[u<<1|1].maxv+=tr[u<<1|1].reset;
       }
       else{
           tr[u<<1|1].add+=tr[u].add;
           tr[u<<1|1].maxv+=tr[u].add;
       }
       tr[u].add=0;
    }
    if(tr[u].reset!=inf){
        tr[u<<1].add=0;
        tr[u<<1].reset=tr[u].reset;
        tr[u<<1].maxv=tr[u].reset;
        tr[u<<1|1].add=0;
        tr[u<<1|1].reset=tr[u].reset;
        tr[u<<1|1].maxv=tr[u].reset;
        tr[u].reset=inf;
    }
}
void build(int u,int l,int r){
    tr[u]={l,r,0,inf,0};
    if(l==r){
        tr[u].maxv=w[l];
    }
    else{
        int mid=l+r>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
void modify1(int u,int l,int r,int x){
    if(tr[u].l>=l&&tr[u].r<=r){
        tr[u].maxv=x;
        tr[u].add=0;
        tr[u].reset=x;
        return;
    }
    else{
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify1(u<<1,l,r,x);
        if(r>mid)modify1(u<<1|1,l,r,x);
        pushup(u);
    }
}
void modify2(int u,int l,int r,int x){
    if(tr[u].l>=l&&tr[u].r<=r){
        if(tr[u].reset!=inf){
            tr[u].reset+=x;
            tr[u].maxv+=x;
            return;
        }
        else{
            tr[u].add+=x;
            tr[u].maxv+=x;
            return;
        }
    }
    else{
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)modify2(u<<1,l,r,x);
        if(r>mid)modify2(u<<1|1,l,r,x);
        pushup(u);
    }
}
ll query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r){
        return tr[u].maxv;
    }
    else{
        pushdown(u);
        ll maxv=-LLONG_MAX;
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid)maxv=max(maxv, query(u<<1,l,r));
        if(r>mid)maxv=max(maxv,query(u<<1|1,l,r));
        return maxv;
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    build(1,1,n);
    while(m--){
        int opt;
        cin>>opt;
        if(opt==1){
            int l,r,x;
            cin>>l>>r>>x;
            modify1(1,l,r,x);//gaiweix;
        }
        else if(opt==2){
            int l,r,x;
            cin>>l>>r>>x;
            modify2(1,l,r,x);
        }
        else if(opt==3){
            int l,r;
            cin>>l>>r;
            cout<<query(1,l,r)<<endl;
        }
    }
    return 0;
}
2024/4/5 13:23
加载中...