#include <bits/stdc++.h>
using namespace std;
long long maxv[50000010],a[10000010];
long long lazy[50000010];
long long lazy1[50000010];
long long n,q;
void pushdown1(long long id){
if(lazy[id]!=-1145141919810){
lazy[id*2]=lazy[id];
lazy[id*2+1]=lazy[id];
maxv[id*2]=lazy[id];
maxv[id*2+1]=lazy[id];
lazy[id]=-1145141919810;
}
if(lazy1[id]){
lazy1[id*2]+=lazy1[id];
lazy1[id*2+1]+=lazy1[id];
maxv[id*2]+=lazy1[id];
maxv[id*2+1]+=lazy1[id];
lazy1[id]=0;
}
}
void pushdown(long long id){
lazy1[id]=0;
lazy1[id*2]=0;
lazy1[id*2+1]=0;
pushdown1(id);
}
void update(long long id,long long l,long long r,long long x,long long y,long long v){
if(x<=l&&y>=r){
maxv[id]=v;
lazy[id]=v;
return;
}
pushdown(id);
long long mid=(l+r)/2;
if(x<=mid){
update(id*2,l,mid,x,y,v);
}
if(y>mid){
update(id*2+1,mid+1,r,x,y,v);
}
maxv[id]=max(maxv[id*2],maxv[id*2+1]);
}
void update1(long long id,long long l,long long r,long long x,long long y,long long v){
if(x<=l&&y>=r){
maxv[id]+=v;
lazy1[id]+=v;
return;
}
pushdown1(id);
long long mid=(l+r)/2;
if(x<=mid){
update1(id*2,l,mid,x,y,v);
}
if(y>mid){
update1(id*2+1,mid+1,r,x,y,v);
}
maxv[id]=max(maxv[id*2],maxv[id*2+1]);
}
long long question(long long id,long long l,long long r,long long x,long long y){
if(x<=l&&y>=r){
return maxv[id];
}
pushdown1(id);
long long mid=(l+r)/2;
long long temp1=0,temp2=0;
if(x<=mid){
temp1=question(id*2,l,mid,x,y);
}
if(y>mid){
temp2=question(id*2+1,mid+1,r,x,y);
}
return max(temp1,temp2);
}
int main(){
cin>>n;
cin>>q;
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
update(1,1,n,i,i,a[i]);
}
for(long long i=1;i<=40000005;i++){
lazy[i]=-1145141919810;
}
for(long long i=1;i<=q;i++){
int op;
cin>>op;
long long l,r;
long long x;
if(op==1){
scanf("%lld %lld %lld",&l,&r,&x);
update(1,1,n,l,r,x);
}
if(op==2){
scanf("%lld %lld %lld",&l,&r,&x);
update1(1,1,n,l,r,x);
}
if(op==3){
scanf("%lld %lld",&l,&r);
long long ans=question(1,1,n,l,r);
printf("%lld\n",ans);
}
}
return 0;
}