#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000005,M=-1e9;
int s[4*MAXN+1],m,n,a[MAXN],y,lz[4*MAXN+1],z,lz1[4*MAXN+1];
bool lz2[4*MAXN+1];
void build(int x,int l,int r)
{
if(l==r)
{
s[x]=a[l];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
s[x]=max(s[x*2],s[x*2+1]);
}
void pushdown(int x,int l,int r)
{
if(lz2[x])
{
s[x*2]=lz1[x];
s[x*2+1]=lz1[x];
lz1[x*2+1]=lz1[x];
lz1[x*2]=lz1[x];
lz2[x]=0;
lz2[x*2]=1;
lz2[x*2+1]=1;
}
s[x*2]+=lz[x];
s[x*2+1]+=lz[x];
lz[x*2]+=lz[x];
lz[x*2+1]+=lz[x];
lz[x]=0,lz1[x]=0;
}
void upd(int x,int l,int r,int lb,int rb,int v)
{
if(lb<=l&&r<=rb)
{
s[x]=v;
lz1[x]=v;
lz2[x]=1;
lz[x]=0;
return;
}
if(lb>r||l>rb)
{
return;
}
pushdown(x,l,r);
int mid=(l+r)/2;
upd(x*2,l,mid,lb,rb,v);
upd(x*2+1,mid+1,r,lb,rb,v);
s[x]=max(s[x*2],s[x*2+1]);
}
void add(int x,int l,int r,int lb,int rb,int v)
{
if(lb<=l&&r<=rb)
{
s[x]+=v;
lz[x]+=v;
return;
}
if(lb>r||l>rb)
{
return;
}
pushdown(x,l,r);
int mid=(l+r)/2;
add(x*2,l,mid,lb,rb,v);
add(x*2+1,mid+1,r,lb,rb,v);
s[x]=max(s[x*2],s[x*2+1]);
}
int ask(int l,int r,int x,int lb,int rb)
{
if(lb<=l&&r<=rb)
{
return s[x];
}
if(lb>r||rb<l)
{
return M;
}
pushdown(x,l,r);
int mid=(l+r)/2;
return max(ask(l,mid,x*2,lb,rb),ask(mid+1,r,x*2+1,lb,rb));
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++)
{
scanf("%d",&a[i]);
}
build(1,1,m);
int g;
for(int i=1;i<=n;i++)
{
int k;
scanf("%d%d%d",&g,&y,&z);
if(g==1)
{
scanf("%d",&k);
upd(1,1,m,y,z,k);
}
else if(g==2)
{
scanf("%d",&k);
add(1,1,m,y,z,k);
}
else if(g==3)
{
cout<<ask(1,m,1,y,z)<<endl;
}
}
return 0;
}