#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,sum[4000010],ans=0,a[4000010],x,y,tag[4000010],tag2[4000010],q;
void gou_zao(int o,int l,int r)
{
if(l==r)
{
sum[o]=a[l];
return;
}
int mid=(l+r)/2;
gou_zao(o<<1,l,mid);
gou_zao(o<<1|1,mid+1,r);
sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
void add(int o,int l,int r,int v)
{
if(r<x||l>y)
{
return;
}
if(x<=l&&r<=y)
{
sum[o]=v;
tag[o]=v;
tag2[o]=0;
return;
}
int mid=(l+r)/2;
sum[o<<1]=tag[o];
tag[o<<1]=tag[o];
sum[o<<1|1]=tag[o];
tag[o<<1|1]=tag[o];
tag[o]=0;
add(o<<1,l,mid,v);
add(o<<1|1,mid+1,r,v);
sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
void add2(int o,int l,int r,int v)
{
if(r<x||l>y)
{
return;
}
if(x<=l&&r<=y)
{
sum[o]+=v;
tag2[o]+=v;
return;
}
int mid=(l+r)/2;
sum[o<<1]+=tag2[o];
tag2[o<<1]+=tag2[o];
sum[o<<1|1]+=tag2[o];
tag2[o<<1|1]+=tag2[o];
tag2[o]=0;
add2(o<<1,l,mid,v);
add2(o<<1|1,mid+1,r,v);
sum[o]=max(sum[o<<1],sum[o<<1|1]);
}
int chaxun(int o,int l,int r)
{
if(r<x||l>y)
{
return -1e9;
}
if(x<=l&&r<=y)
{
return sum[o];
}
int mid=(l+r)/2;
if(tag[o])
{
tag2[o]=0;
sum[o<<1]=tag[o];
tag[o<<1]=tag[o];
sum[o<<1|1]=tag[o];
tag[o<<1|1]=tag[o];
tag[o]=0;
}
else if(tag2[o])
{
sum[o<<1]+=tag2[o];
tag2[o<<1]+=tag2[o];
sum[o<<1|1]+=tag2[o];
tag2[o<<1|1]+=tag2[o];
tag2[o]=0;
}
return max(chaxun(o<<1,l,mid),chaxun(o<<1|1,mid+1,r));
}
signed main()
{
cin>>n>>q;
memset(sum,-0x3f3f3f3f,sizeof(sum));
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
gou_zao(1,1,n);
for(int i=1;i<=q;i++)
{
int op,k;
cin>>op>>x>>y;
if(op==1)
{
cin>>k;
add(1,1,n,k);
}
if(op==2)
{
cin>>k;
add2(1,1,n,k);
}
if(op==3)
{
cout<<chaxun(1,1,n)<<endl;
}
}
}