#include<bits/stdc++.h>
using namespace std;
long long FU=-1e18,xx,yy,kk,m,okc[10000005],n,a[1000005],s[10000005],biao,lazy[10000005],lczy[10000005];
void buildtree(long long pos,long long lt,long long rt){
if(lt==rt){
s[pos]=a[lt];
return;
}
long long mid=(lt+rt)/2;
buildtree(pos*2,lt,mid);
buildtree(pos*2+1,mid+1,rt);
s[pos]=max(s[pos*2],s[pos*2+1]);
}
void push_down(long long pos){
if(okc[pos]){
lczy[pos*2]=lczy[pos*2+1]=lczy[pos];
s[pos*2]=s[pos*2+1]=lczy[pos];
okc[pos]=0;
}
if(lazy[pos]){
lazy[pos*2]+=lazy[pos];
lazy[pos*2+1]+=lazy[pos];
s[pos*2]+=lazy[pos];
s[pos*2+1]+=lazy[pos];
lazy[pos]=0;
}
}
void cdd(long long xx,long long yy,long long kk,long long pos,long long lt,long long rt){
if(xx<=lt and rt<=yy){
s[pos]=kk;
lczy[pos]=kk;
okc[pos]=1;
return;
}
push_down(pos);
if(lt==rt)return;
long long mid=(lt+rt)/2;
if(xx<=mid)cdd(xx,yy,kk,pos*2,lt,mid);
if(yy>mid)cdd(xx,yy,kk,pos*2+1,mid+1,rt);
s[pos]=max(s[pos*2],s[pos*2+1]);
}
void add(long long xx,long long yy,long long kk,long long pos,long long lt,long long rt){
if(xx<=lt and rt<=yy){
s[pos]+=kk;
lazy[pos]+=kk;
return;
}
push_down(pos);
if(lt==rt)return;
long long mid=(lt+rt)/2;
if(xx<=mid)add(xx,yy,kk,pos*2,lt,mid);
if(yy>mid)add(xx,yy,kk,pos*2+1,mid+1,rt);
s[pos]=max(s[pos*2],s[pos*2+1]);
}
long long qiu(long long xx,long long yy,long long pos,long long lt,long long rt){
if(xx<=lt and rt<=yy){
return s[pos];
}
push_down(pos);
long long mid=(lt+rt)/2,sum=FU;
if(xx<=mid)sum=max(sum,qiu(xx,yy,pos*2,lt,mid));
if(yy>mid)sum=max(sum,qiu(xx,yy,pos*2+1,mid+1,rt));
return sum;
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)scanf("%lld",&a[i]);
buildtree(1,1,n);
for(long long i=1;i<=m;i++){
scanf("%lld%lld%lld",&biao,&xx,&yy);
if(biao==1){;
scanf("%lld",&kk);
cdd(xx,yy,kk,1,1,n);
}else if(biao==2){
scanf("%lld",&kk);
add(xx,yy,kk,1,1,n);
}else{
printf("%lld\n",qiu(xx,yy,1,1,n));
}
}
return 0;
}