代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define M 1000005
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
int t[M<<2],rt1[M<<2],rt2[M<<2];
int vis[M<<2];
inline void pushup(int x){
t[x]=max(t[ls(x)],t[rs(x)]);
}
inline void push_down(int p){
// cout<<l<<' '<<r<<' '<<t[p]<<' '<<rt1[p]<<' '<<rt2[p]<<"^\n";
if(vis[p]){
t[ls(p)]=rt2[p];
rt2[ls(p)]=rt2[p];
t[rs(p)]=rt2[p];
rt2[rs(p)]=rt2[p];
vis[rs(p)]=vis[ls(p)]=1;
rt2[p]=0;
vis[p]=0;
rt1[rs(p)]=rt2[ls(p)]=0;
}
t[ls(p)]+=rt1[p];
rt1[ls(p)]+=rt1[p];
t[rs(p)]+=rt1[p];
rt1[rs(p)]+=rt1[p];
rt1[p]=0;
}
inline void build(int p,int l,int r){
t[p]=-1e18;
if(l==r){
scanf("%lld",&t[p]);
// cout<<t[p]<<";\n";
// cout<<l<<' '<<r<<' '<<t[p]<<'-'<<p<<"+\n";
return;
}
int mid=((l+r)>>1);
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
// cout<<l<<' '<<r<<' '<<t[p]<<' '<<t[ls(p)]<<' '<<t[rs(p)]<<"P\n";
}
inline int qry(int l,int r,int x,int y,int p){
int maxn=-1e16;
if((l<=x&&y<=r)||vis[p]){
// cout<<x<<' '<<y<<' '<<t[p]<<")\n";
return t[p];
}
push_down(p);
int mid=((x+y)>>1);
if(l<=mid)maxn=max(maxn,qry(l,r,x,mid,ls(p)));
if(r>mid)maxn=max(maxn,qry(l,r,mid+1,y,rs(p)));
pushup(p);
// cout<<maxn<<"l\n";
return maxn;
}
inline void add(int l,int r,int k,int x,int y,int p){
if(l<=x&&y<=r){
// cout<<x<<' '<<y<<' '<<t[p]<<' '<<p<<"=\n";
t[p]+=k;
if(vis[p])rt2[p]+=k;
else rt1[p]+=k;
// cout<<x<<' '<<y<<' '<<t[p]<<"*\n";
return;
}
push_down(p);
int mid=((x+y)>>1);
if(l<=mid)add(l,r,k,x,mid,ls(p));
if(r>mid)add(l,r,k,mid+1,y,rs(p));
pushup(p);
}
inline void ass(int l,int r,int k,int x,int y,int p){
if(l<=x&&y<=r){
t[p]=k,rt2[p]=k,vis[p]=1;
rt1[p]=0;
// cout<<x<<' '<<y<<' '<<t[p]<<"!\n";
return;
}
push_down(p);
int mid=((x+y)>>1);
if(l<=mid)ass(l,r,k,x,mid,ls(p));
if(r>mid)ass(l,r,k,mid+1,y,rs(p));
pushup(p);
}
signed main(){
int n,m;
scanf("%lld%lld",&n,&m);
build(1,1,n);
while(m--){
int op,l,r,x;
scanf("%lld%lld%lld",&op,&l,&r);
if(l>r)l^=r,r^=l,l^=r;
if(op==1){
scanf("%lld",&x);
ass(l,r,x,1,n,1);
}else
if(op==2){
scanf("%lld",&x);
add(l,r,x,1,n,1);
}else
if(op==3)printf("%lld\n",qry(l,r,1,n,1));
}
return 0;
}