#include<bits/stdc++.h>
using namespace std;
#define v k-(t[d])*u
int n,m,a[100100],t[404000],q,x,y,k,u,z[101000];
void bu(int d,int l,int r){
if(l==r){
t[d]=a[l];
return;
}
int f=(l+r)/2;
bu(d*2,l,f);
bu(d*2+1,f+1,r);
t[d]=max(t[d*2],t[d*2+1]);
}
void dn(int d,int l,int r){
if(z[d]){
int f=(l+r)/2;
z[d*2]+=z[d];
z[d*2+1]+=z[d];
t[d*2]+=z[d]*(f-l+1);
t[d*2+1]+=z[d]*(r-f);
z[d]=0;
}
}
void la(int d,int l,int r){
if(x<=l&&r<=y){
z[d]+=v;
return;
}
dn(d,l,r);
int f=(l+r)/2;
if(x<=f){
la(d*2,l,f);
}
if(f<y){
la(d*2+1,f+1,r);
}
t[d]=max(t[d*2],t[d*2+1]);
}
int findl(int d,int l,int r){
if(x<=l&&r<=y){
return t[d];
}
dn(d,l,r);
int f=(l+r)/2,s=0;
if(x<=f){
s=max(s,findl(d*2,l,f));
}
if(f<y){
s=max(s,findl(d*2+1,f+1,r));
}
return s;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
bu(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&q,&x,&y);
if(q==1){
u=1;
scanf("%d",&k);
la(1,1,n);
}
if(q==2){
u=0;
scanf("%d",&k);
la(1,1,n);
}
if(q==3){
u=0;
printf("%d\n",findl(1,1,n));
}
//printf("%d %d %d&\n",q,x,y);
}
return 0;
}