#include <iostream>
using namespace std;
long long biao1[4000010],biao2[4000010],ans[4000010];
int n,q,a[1000010],l[4000010],r[4000010],qwq[4000010],awa[4000010];
void maketree(int p,int l,int r){
if(l==0||r==0)
return ;
if(l>r)
return ;
if(l==r){
qwq[p]=l;
awa[p]=r;
ans[p]=a[l];
biao1[p]=a[l];
return ;
}
qwq[p]=l;
awa[p]=r;
maketree(2*p,l,(l+r)/2);
maketree(2*p+1,(l+r)/2+1,r);
ans[p]=max(ans[p*2],ans[p*2+1]);
return ;
}
void apply(int p,int k1,int k2){
if(k1!=-1e16-10){
biao2[p]=0;
biao1[p]=k1;
ans[p]=k1;
}
biao2[p]+=k2;
ans[p]+=k2;
return ;
}
void pushdown(int p,int l,int r){
apply(2*p,biao1[p],biao2[p]);
apply(2*p+1,biao1[p],biao2[p]);
biao1[p]=-1e16-10;
biao2[p]=0;
return ;
}
void pushup(int p){
ans[p]=max(ans[p],max(ans[2*p],ans[2*p+1]));
return ;
}
void cao2(int p,int l,int r,int lx,int rx,int k){
if(r<lx||l>rx)
return ;
if(lx<=l&&r<=rx){
apply(p,-1e16-10,k);
return ;
}
pushdown(p,l,r);
cao2(2*p,l,(l+r)/2,lx,rx,k);
cao2(2*p+1,(l+r)/2+1,r,lx,rx,k);
pushup(p);
return ;
}
void cao1(int p,int l,int r,int lx,int rx,int k){
if(r<lx||l>rx)
return ;
if(lx<=l&&r<=rx){
apply(p,k,0);
return ;
}
pushdown(p,l,r);
cao1(2*p,l,(l+r)/2,lx,rx,k);
cao1(2*p+1,(l+r)/2+1,r,lx,rx,k);
pushup(p);
return ;
}
long long cao3(int p,int l,int r,int lx,int rx){
if(r<lx||l>rx)
return -1e16-10;
if(lx<=l&&r<=rx){
return ans[p];
}
pushdown(p,l,r);
ans[p]=max(ans[p],max(cao3(2*p,l,(l+r)/2,lx,rx),cao3(2*p+1,(l+r)/2+1,r,lx,rx)));
return ans[p];
}
int main(){
cin>>n>>q;
for(int i=0;i<=4000005;i++){
ans[i]=-1e16;
biao1[i]=-1e16;
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
maketree(1,1,n);
while(q--){
int op,x,y,k;
cin>>op;
if(op==1){
cin>>x>>y>>k;
cao1(1,1,n,x,y,k);
}
if(op==2){
cin>>x>>y>>k;
cao2(1,1,n,x,y,k);
}
if(op==3){
cin>>x>>y;
cout<<cao3(1,1,n,x,y)<<endl;
}
}
return 0;
}