讨论里的几个hack都能过
#include<bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
#define mid (l+r)/2
using namespace std;
int n,m,f[500100<<2],b[500100<<2],a[500100],opt,x,y,z,mh[500100<<2],ih[500100<<2];
void build(int x,int l,int r){
mh[x]=ih[x]=-0x3f3f3f3f;
if(l==r){
f[x]=a[l];
return;
}
build(ls,l,mid);
build(rs,mid+1,r);
f[x]=max(f[ls],f[rs]);
}
void zou(int x,int l,int r,int k,int mk,int ik){
if(mk!=-0x3f3f3f3f){
if(f[x]>mk){
f[x]=mk;
mh[x]=mk;b[x]=0;
}
// b[x]=mk-f[x];
}
if(ik!=-0x3f3f3f3f){
if(f[x]<ik){
f[x]=ik;
ih[x]=ik;b[x]=0;
}
// b[x]=ik-f[x];
}
f[x]+=k;
b[x]+=k;
}
void biaoji(int x,int l,int r){
zou(ls,l,mid,b[x],mh[x],ih[x]);
zou(rs,mid+1,r,b[x],mh[x],ih[x]);
b[x]=0;mh[x]=-0x3f3f3f3f;ih[x]=-0x3f3f3f3f;
}
int cha(int x,int l,int r,int ll,int rr){
if(ll<=l&&r<=rr){
return f[x];
}
biaoji(x,l,r);
int ans=-0x3f3f3f3f;
if(ll<=mid)ans=max(ans,cha(ls,l,mid,ll,rr));
if(rr>mid)ans=max(ans,cha(rs,mid+1,r,ll,rr));
return ans;
}
void jia(int x,int l,int r,int ll,int rr,int k){
if(ll<=l&&r<=rr){
f[x]+=k;
// if(mh[x]!=-0x3f3f3ff3)mh[x]+=k;
// if(ih[x]!=-0x3f3f3f3f)ih[x]+=k;
b[x]+=k;
return ;
}
biaoji(x,l,r);
if(ll<=mid)jia(ls,l,mid,ll,rr,k);
if(rr>mid)jia(rs,mid+1,r,ll,rr,k);
f[x]=max(f[ls],f[rs]);
}
void xiangao(int x,int l,int r,int ll,int rr,int k){
if(ll<=l&&r<=rr){
if(f[x]>k){
f[x]=k;
b[x]=0;
mh[x]=k;ih[x]=-0x3f3f3f3f;
}
return ;
}
biaoji(x,l,r);
if(ll<=mid)xiangao(ls,l,mid,ll,rr,k);
if(rr>mid)xiangao(rs,mid+1,r,ll,rr,k);
f[x]=max(f[ls],f[rs]);
}
void xiandi(int x,int l,int r,int ll,int rr,int k){
if(ll<=l&&r<=rr){
if(f[x]<k){
f[x]=k;
b[x]=0;
ih[x]=k;mh[x]=-0x3f3f3f3f;
}
return ;
}
biaoji(x,l,r);
if(ll<=mid)xiandi(ls,l,mid,ll,rr,k);
if(rr>mid)xiandi(rs,mid+1,r,ll,rr,k);
f[x]=max(f[ls],f[rs]);
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
while(m--){
scanf("%d",&opt);
if(opt==1){
scanf("%d%d%d",&x,&y,&z);
jia(1,1,n,x,y,z);
// puts("---");
// for(int i=1;i<=n;i++){
// cout<<cha(1,1,n,i,i)<<" ";
// }puts("");
// puts("---");
}else if(opt==2){
scanf("%d%d%d",&x,&y,&z);
xiangao(1,1,n,x,y,z);
}else if(opt==3){
scanf("%d%d%d",&x,&y,&z);
xiandi(1,1,n,x,y,z);
}else{
scanf("%d%d",&x,&y);
cout<<cha(1,1,n,x,y)<<endl;
}
// puts("---");
// for(int i=1;i<=n;i++){
// cout<<cha(1,1,n,i,i)<<" ";
// }puts("");
// puts("---");
}
return 0;
}