RT
#include<iostream>
using namespace std;
const int N=1000010;
const int fx=-(1e9+10);
typedef long long ll;
ll t_add[N],t_change[N],t_max[N];
ll a[N];
void push(int l,int r,int pos) {
int mid=(l+r)>>1;
int ls=pos<<1;
int rs=pos<<1|1;
if(t_change[pos]!=fx) {
t_change[ls]=t_change[pos];
t_change[rs]=t_change[pos];
t_add[ls]=0;
t_add[rs]=0;
t_max[ls]=t_change[pos];
t_max[rs]=t_change[pos];
t_change[pos]=fx;
}
t_add[ls]+=t_add[pos];
t_add[rs]+=t_add[pos];
t_add[pos]=0;
}
void chan(int l,int r,int cl,int cr,int pos,int cv) {
// if(l==r){
// t_max[pos]=cv;
// }
if(cl<=l&&r<=cr) {
t_add[pos]=0;
t_max[pos]=cv;
t_change[pos]=cv;
return ;
}
int mid=(l+r)>>1;
push(l,r,pos);
if(cl<=mid)
chan(l,mid,cl,cr,pos<<1,cv);
if(cr>mid)
chan(mid+1,r,cl,cr,pos<<1|1,cv);
t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
}
void add(int l,int r,int al,int ar,int pos,int av) {
if(al<=l&&r<=ar) {
t_add[pos]+=av;
// t_max[pos]+=t_add[pos];
// t_add[pos]=0;
return ;
}
int mid=(l+r)>>1;
push(l,r,pos);
if(al<=mid)
add(l,mid,al,ar,pos<<1,av);
if(ar>mid)
add(mid+1,r,al,ar,pos<<1|1,av);
t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
}
void build(int l,int r,int pos) {
if(l==r) {
t_max[pos]=a[l];
t_change[pos]=fx;
t_add[pos]=0;
return ;
}
int mid=(l+r)>>1;
build(l,mid,pos<<1);
build(mid+1,r,pos<<1|1);
t_max[pos]=max(t_max[pos<<1],t_max[pos<<1|1]);
t_add[pos]=0;
t_change[pos]=fx;
return ;
}
ll ss(int l,int r,int sl,int sr,int pos) {
if(l==r) {
if(t_change[pos]!=fx) t_max[pos]=t_change[pos];
t_max[pos]+=t_add[pos];
t_add[pos]=0;
return t_max[pos];
}
if(sl<=l&&r<=sr) {
push(l,r,pos);
t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
return t_max[pos];
}
int mid=(l+r)>>1;
push(l,r,pos);
ll ans;
if(sl<=mid)
ans=ss(l,mid,sl,sr,pos<<1);
if(sr>mid)
ans=max(ss(mid+1,r,sl,sr,pos<<1|1),ans);
t_max[pos]=max(t_max[pos<<1]+t_add[pos<<1],t_max[pos<<1|1]+t_add[pos<<1|1]);
return ans;
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) {
scanf("%d",a+i);
}
build(1,n,1);
while(m--) {
int opt;
scanf("%d",&opt);
int l,r;
scanf("%d %d",&l,&r);
if(opt==1) {
int cc;
cin>>cc;
chan(1,n,l,r,1,cc);
continue;
}
if(opt==2) {
int aa;
cin>>aa;
add(1,n,l,r,1,aa);
continue;
}
if(opt==3) {
cout<<ss(1,n,l,r,1)<<endl;
}
}
return 0;
}