线段树求调!

P1253 扶苏的问题

lgx57 @ 2024-05-21 20:24:27

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void fio(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}
int ls(int x){
    return x<<1;
}
int rs(int x){
    return x<<1|1;
}
int n,q;
const int N=1e5+5;
int a[N],tree[N<<2],tag1[N<<2],tag2[N<<2];
void push_up(int p){
    tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void build(int p,int pl,int pr){
    if (pl==pr){
        tag2[p]=a[pl];
        tree[p]=a[pl];
        return ;
    }
    int mid=(pl+pr)>>1;
    build(ls(p),pl,mid);
    build(rs(p),mid+1,pr);
    push_up(p);
}
void addtag1(int p,int pl,int pr,int d){
    tag1[p]+=d;
    tree[p]+=d*(pr-pl+1);
}
void addtag2(int p,int pl,int pr,int d){
    tag2[p]=d;
    tree[p]=d*(pr-pl+1);
}
void push_down1(int p,int pl,int pr){
    if (tag1[p]){
        int mid=(pl+pr)>>1;
        addtag1(ls(p),pl,mid,tag1[p]);
        addtag1(rs(p),mid+1,pr,tag1[p]);
        tag1[p]=0;
    }
}
void push_down2(int p,int pl,int pr){
    int mid=(pl+pr)>>1;
    addtag2(ls(p),pl,mid,tag2[p]);
    addtag2(rs(p),mid+1,pr,tag2[p]);
    tag2[p]=0;
}
void update1(int l,int r,int p,int pl,int pr,int d){
    if (l<=pl&&pr<=r){
        addtag1(p,pl,pr,d);
        return ;
    }
    push_down1(p,pl,pr);
    int mid=(pl+pr)>>1;
    if (l<=mid){
        update1(l,r,ls(p),pl,mid,d);
    }
    if (r>mid){
        update1(l,r,rs(p),mid+1,pr,d);
    }
    push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int d){
    if (l<=pl&&pr<=r){
        addtag2(p,pl,pr,d);
        return ;
    }
    push_down2(p,pl,pr);
    int mid=(pl+pr)>>1;
    if (l<=mid){
        update2(l,r,ls(p),pl,mid,d);
    }
    if (r>mid){
        update2(l,r,rs(p),mid+1,pr,d);
    }
    push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
    if (l<=pl&&pr<=r){
        return tree[p];
    }
    push_down2(p,pl,pr);
    push_down1(p,pl,pr);
    int ans=0;
    int mid=(pl+pr)>>1;
    if (l<=mid){
        ans=max(ans,query(l,r,ls(p),pl,mid));
    }
    if (r>mid){
        ans=max(ans,query(l,r,rs(p),mid+1,pr));
    }
    return ans;
}
signed main(){
    fio();
    cin>>n>>q;
    for (int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    while (q--){
        int opt,x,y,k;
        cin>>opt;
        if (opt==1){
            cin>>x>>y>>k;
            update2(x,y,1,1,n,k);
        }
        else if(opt==2){
            cin>>x>>y>>k;
            update1(x,y,1,1,n,k);
        }
        else{
            cin>>x>>y;
            cout<<query(x,y,1,1,n)<<endl;
        }
    }
    return 0;
}

|