#include<bits/stdc++.h>
using namespace std;
int n,q;
const int N=1e6+10;
int B,tag[N],cl[N],cr[N],a[N],max_[N],C[N];
inline void build(){
for(int k=1;k<=(n%B==0?n/B:n/B+1);k++)
{
for(int i=(k-1)*B+1;i<=min(n,k*B);i++)
{
tag[i]=k;
cl[i]=(k-1)*B+1;
cr[i]=min(n,k*B);
max_[k]=max(max_[k],a[i]);
}
}
return ;
}
inline void add_on(int l,int r,int k)
{
if(tag[l]==tag[r])
{
for(int i=l;i<=r;i++)
{
a[i]+=k;
max_[tag[i]]=max(max_[tag[i]],a[i]);
}
}
else
{
for(int i=l;i<=cr[l];i++)
{
a[i]+=k;
max_[tag[i]]=max(max_[tag[i]],a[i]);
}
for(int i=cl[r];i<=r;i++)
{
a[i]+=k;
max_[tag[i]]=max(max_[tag[i]],a[i]);
}
for(int i=tag[l]+1;i<=tag[r]-1;i++)
{
C[i]+=k;
}
}
return ;
}
inline void query(int l,int r)
{
int ans=0;
if(tag[l]==tag[r])
{
for(int i=l;i<=r;i++)
{
ans=max(ans,a[i]+C[tag[i]]);
}
}
else
{
for(int i=l;i<=cr[l];i++)
{
ans=max(ans,a[i]+C[tag[i]]);
}
for(int i=cl[r];i<=r;i++)
{
ans=max(ans,a[i]+C[tag[i]]);
}
for(int i=tag[l]+1;i<=tag[r]-1;i++)
{
ans=max(ans,max_[i]+C[i]);
}
}
cout<<ans<<endl;
return ;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
memset(max_,-0x3f3f3f3f,sizeof(max_));
cin>>n>>q;
B=sqrt(n);
for(int i=1;i<=n;i++)
cin>>a[i];
build();
for(int i=1;i<=q;i++)
{
int opt;
cin>>opt;
if(opt==1)
{
int l,r,x;
cin>>l>>r>>x;
for(int i=l;i<=r;i++)
{
a[i]=x;
}
if(tag[l]==tag[r])
{
max_[tag[i]]=-0x3f3f3f;
for(int i=cl[l];i<=cr[l];i++)
{
max_[tag[i]]=max(a[i],max_[tag[i]]);
}
}
else
{
max_[tag[l]]=-0x3f3f3f;
for(int i=cl[l];i<=cr[l];i++)
{
max_[tag[i]]=max(a[i],max_[tag[i]]);
}
max_[tag[r]]=-0x3f3f3f;
for(int i=cl[r];i<=cr[r];i++)
{
max_[tag[i]]=max(a[i],max_[tag[i]]);
}
for(int i=tag[l]+1;i<=tag[r]-1;i++)
{
max_[i]=x;
}
}
}
if(opt==2)
{
int l,r,x;
cin>>l>>r>>x;
add_on(l,r,x);
}
if(opt==3)
{
int l,r;
cin>>l>>r;
query(l,r);
}
}
return 0;
}