code
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define res t[id].lazy=0,t[id].cov=0,t[id].u=false
using namespace std;
const long long _MIN_=-0x7f7f7f7f;
//inline int read(){//fastread
// int res=0,f=1;
// char ch=getchar();
// while(!isdigit(ch)){ if(ch=='-') f=-1; ch=getchar();}
// while(isdigit(ch)){ res=res*10+ch-48; ch=getchar();}
// return res*f;
//}
const int maxn=100000+10;
struct SegmentTree{
int L,R;
int lazy,max,cov;
bool u;
} t[maxn*100];
int n,a[maxn];
void up(int id){
t[id].max=max(t[id*2].max,t[id*2+1].max);
}
void down(int id){//下传
if(!(t[id].u)){
t[id*2].lazy+=t[id].lazy;
t[id*2+1].lazy+=t[id].lazy;
t[id*2].max+=t[id].lazy;
t[id*2+1].max+=t[id].lazy;
res;
}
else{
t[id*2].cov=t[id].cov;
t[id*2+1].cov=t[id].cov;
t[id*2].lazy=t[id].lazy;
t[id*2+1].lazy=t[id].lazy;
t[id*2].max=t[id].lazy+t[id].cov;
t[id*2+1].max=t[id].lazy+t[id].cov;
t[id*2].u=true;
t[id*2+1].u=true;
res;
}
}
void build(int id,int l,int r){//建立
t[id].L=l; t[id].R=r;
if(l==r){
t[id].max=a[l];
return;
}
int mid=(l+r)/2;
build(id*2,l,mid); //左子树
build(id*2+1,mid+1,r);//右子树
up(id);
}
void update(int id,int l,int r,int val){//将l,r区间同时加上一个val
if(t[id].L>r || t[id].R<l) return;
if(t[id].L>=l && t[id].R<=r){//节点自己处理
t[id].lazy+=val;
t[id].max+=val;
return;
}
if(t[id].lazy!=0) down(id);
update(id*2,l,r,val);
update(id*2+1,l,r,val);
up(id);
}//修改操作
void change(int id,int l,int r,int val){
if(l<=t[id].L&&t[id].R<=r){
t[id].cov=val;
t[id].lazy=0;
t[id].max=val;
return;
}
if(t[id].cov!=0) down(id);
change(id*2,l,r,val);
change(id*2+1,l,r,val);
up(id);
}//覆盖操作
int ask_max(int id,int l,int r){//查询区间最大值
if(t[id].L>r || t[id].R<l) return _MIN_;
if(t[id].L>=l && t[id].R<=r) return t[id].max;
if(t[id].lazy !=0) down(id);
return max(ask_max(id*2,l,r),ask_max(id*2+1,l,r));
}
signed main(){
int m,opt,l,r,val;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
cin>>opt;
if(opt==1){
cin>>l>>r>>val;
change(1,l,r,val);
}
else if(opt==2){
cin>>l>>r>>val;
update(1,l,r,val);
}
else{
cin>>l>>r;
cout<<ask_max(1,l,r)<<endl;
}
}
return 0;
}