DNWdpl @ 2024-11-20 18:52:39
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int MAXN=1e9+5;
struct node{
int max,l,r,lzsum,lzcover;
}tree[4*N];
int a[N];
void build_tree(int p,int l,int r){
tree[p].l=l,tree[p].r=r;
tree[p].lzcover=MAXN;
if(l==r){
tree[p].max=a[l];
return ;
}
int mid=(l+r)>>1;
build_tree(p*2,l,mid);
build_tree(p*2+1,mid+1,r);
tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}
void push_downsum(int p){
if(tree[p].lzsum!=0){
tree[p*2].max+=tree[p].lzsum;
tree[p*2+1].max+=tree[p].lzsum;
tree[p*2].lzsum+=tree[p].lzsum;
tree[p*2+1].lzsum+=tree[p].lzsum;
tree[p].lzsum=0;
}
}
void push_downcover(int p){
if(tree[p].lzcover!=MAXN){
tree[p*2].max=tree[p].lzcover;
tree[p*2+1].max=tree[p].lzcover;
tree[p*2].lzcover=tree[p].lzcover;
tree[p*2+1].lzcover=tree[p].lzcover;
tree[p].lzcover=0;
}
}
void coverchange(int p,int l,int r,int z){
if(tree[p].l>=l&&tree[p].r<=r){
tree[p].max=z;
tree[p].lzcover=z;
return ;
}
push_downcover(p);
if(tree[p*2].r>=l) coverchange(p*2,l,r,z);
if(tree[p*2+1].l<=r) coverchange(p*2+1,l,r,z);
tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}
void sumchange(int p,int l,int r,int z){
if(tree[p].l>=l&&tree[p].r<=r){
tree[p].max+=z;
tree[p].lzsum+=z;
return ;
}
push_downsum(p);
if(tree[p*2].r>=l) sumchange(p*2,l,r,z);
if(tree[p*2+1].l<=r) sumchange(p*2+1,l,r,z);
tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}
int ask(int p,int l,int r){
if(tree[p].l>=l&&tree[p].r<=r){
return tree[p].max;
}
push_downcover(p);
push_downsum(p);
int ans=0;
if(tree[p*2].r>=l) ans=max(ask(p*2,l,r),ans);
if(tree[p*2+1].l<=r) ans=max(ask(p*2+1,l,r),ans);
return ans;
}
signed main(){
//freopen("p1253_6.in","r",stdin);
//freopen("p12536.out","w",stdout);
int n,m;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build_tree(1,1,n);
while(m--){
int qwe,l,r,k;
scanf("%lld",&qwe);
if(qwe==1){
scanf("%lld%lld%lld",&l,&r,&k);
coverchange(1,l,r,k);
}else if(qwe==2){
scanf("%lld%lld%lld",&l,&r,&k);
sumchange(1,l,r,k);
}else{
scanf("%lld%lld",&l,&r);
cout<<ask(1,l,r)<<endl;
}
}
return 0;
}
by 熊猫尤里安41 @ 2024-11-29 17:52:21
把ans改为最小值