#1、3AC,其余全WA link 求助QAQ
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f3f;
int n,m,op,l,r,a[N],d;
int t[N<<2],tag[N<<2],mdf[N<<2];
inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}
inline void pushup(int x){
t[x]=max(t[lc(x)],t[rc(x)]);
}
inline void pushdown(int x){
tag[lc(x)]+=tag[x],t[lc(x)]+=tag[x];
tag[rc(x)]+=tag[x],t[rc(x)]+=tag[x];
tag[x]=0;
if(mdf[x]!=INF){
t[lc(x)]=mdf[lc(x)]=mdf[x],tag[lc(x)]=0;
t[rc(x)]=mdf[rc(x)]=mdf[x],tag[rc(x)]=0;
mdf[x]=INF;
}
}
void bulid(int l,int r,int x){
mdf[x]=INF;
if(l==r){
t[x]=a[l];
return ;
}
int mid=(l+r)>>1;
bulid(l,mid,lc(x));
bulid(mid+1,r,rc(x));
pushup(x);
}
void update(int L,int R,int l,int r,int x,int d){
if(l>=L&&r<=R){
t[x]=mdf[x]=d;
tag[x]=0;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,lc(x),d);
if(mid+1<=R) update(L,R,mid+1,r,rc(x),d);
pushup(x);
}
void add(int L,int R,int l,int r,int x,int d){
if(l>=L&&r<=R){
t[x]+=d,tag[x]+=d;
return;
}
pushdown(x);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,l,mid,lc(x),d);
if(mid<R) update(L,R,mid+1,r,rc(x),d);
pushup(x);
}
int query(int L,int R,int l,int r,int x){
if(l>=L&&r<=R)return t[x];
pushdown(x);
int mid=(r+l)>>1;
int ans=-INF;
if(L<=mid) ans=max(ans,query(L,R,l,mid,lc(x)));
if(mid<R) ans=max(ans,query(L,R,mid+1,r,rc(x)));
return ans;
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
bulid(1,n,1);
while(m--){
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1){
scanf("%lld",&d);
update(l,r,1,n,1,d);
}else if(op==2){
scanf("%lld",&d);
add(l,r,1,n,1,d);
}else{
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}