#include<bits/stdc++.h>
#define ll long long
#define int long long
#define pd tr[p]=max(tr[p*2],tr[p*2+1])
using namespace std;
const int N=1e6+9,in=-1e10;
ll n,m,a[N];
ll tr[N*4],b[N*4],c[N*4];
void build(ll p,ll l,ll r){
c[p]=in;
if(r==l){
tr[p]=a[l];
return ;
}
ll mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
tr[p]=max(tr[p*2],tr[p*2+1]);
}
void lanb(ll p){
if(c[p]!=in){
b[p*2]=b[p*2+1]=0;
tr[p*2]=tr[p*2+1]=c[p];
c[p]=in;
}
if(b[p]>0){
tr[p*2]+=b[p],b[p*2]+=b[p];
tr[p*2+1]+=b[p],b[p*2+1]+=b[p];
b[p]=0;
}
}
void change(ll p,ll l,ll r,ll xl,ll xr ,ll k){
if(xl<=l&&r<=xr){
tr[p]+=k;
b[p]+=k;
return ;
}
lanb(p);
ll mid=(l+r)/2;
if(xl<=mid) change(p*2,l,mid,xl,xr,k);
if(xr>mid) change(p*2+1,mid+1,r,xl,xr,k);
pd;
}
void change1(ll p,ll l,ll r,ll xl,ll xr ,ll k){
if(xl<=l&&r<=xr){
tr[p]=c[p]=k;
b[p]=0;
return ;
}
lanb(p);
ll mid=(l+r)/2;
if(xl<=mid) change1(p*2,l,mid,xl,xr,k);
if(xr>mid) change1(p*2+1,mid+1,r,xl,xr,k);
pd;
}
int ask(ll p,ll l,ll r,ll xl,ll xr){
if(xl<=l&&r<=xr) return tr[p];
lanb(p);
ll ans=in;
ll mid=(l+r)/2;
if(xl<=mid) ans=max(ans,ask(p*2,l,mid,xl,xr));
if(xr>mid) ans=max(ans,ask(p*2+1,mid+1,r,xl,xr));
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
ll op,l,r,k;
cin>>op>>l>>r;
if(op==1){
cin>>k;
change1(1,1,n,l,r,k);
}
if(op==2){
cin>>k;
change(1,1,n,l,r,k);
}
if(op==3){
cout<<ask(1,1,n,l,r)<<endl;
}
}
}