#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
int a[4000005],ans[4000005];
int cover_tag[4000005],add_tag[4000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void push_up(int x)
{
ans[x]=max(ans[ls(x)],ans[rs(x)]);
}
void cover_push_down(int p)
{
if(cover_tag[p]!=-1145141919180)
{
add_tag[ls(p)]=add_tag[rs(p)]=0;
ans[ls(p)]=ans[rs(p)]=cover_tag[p];
cover_tag[ls(p)]=cover_tag[rs(p)]=cover_tag[p];
cover_tag[p]=-1145141919180;
}
}
void add_push_down(int p)
{
if(add_tag[p])
{
cover_push_down(p);
ans[ls(p)]+=add_tag[p],ans[rs(p)]+=add_tag[p];
add_tag[ls(p)]+=add_tag[p],add_tag[rs(p)]+=add_tag[p];
add_tag[p]=0;
}
}
void build(int p,int l,int r)
{
if(l==r)
{
ans[p]=a[l];
cover_tag[p]=-1145141919180;
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
void cover_update(int l,int r,int pl,int pr,int p,int x)
{
if(l<=pl&&pr<=r)
{
ans[p]=x;
cover_tag[p]=x;
add_tag[p]=0;
return;
}
cover_push_down(p);
add_push_down(p);
int mid=(pl+pr)>>1;
if(l<=mid)cover_update(l,r,pl,mid,ls(p),x);
if(r>mid)cover_update(l,r,mid+1,pr,rs(p),x);
push_up(p);
}
void add_update(int l,int r,int pl,int pr,int p,int x)
{
if(l<=pl&&pr<=r)
{
cover_push_down(p);
ans[p]+=x;
add_tag[p]+=x;
return;
}
cover_push_down(p);
add_push_down(p);
int mid=(pl+pr)>>1;
if(l<=mid)add_update(l,r,pl,mid,ls(p),x);
if(r>mid)add_update(l,r,mid+1,pr,rs(p),x);
push_up(p);
}
int query(int l,int r,int pl,int pr,int p)
{
if(l<=pl&&pr<=r)return ans[p];
cover_push_down(p);
add_push_down(p);
int res=-1145141919810,mid=(pl+pr)>>1;
if(l<=mid)res=max(res,query(l,r,pl,mid,ls(p)));
if(r>mid)res=max(res,query(l,r,mid+1,pr,rs(p)));
return res;
}
main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(int i=1,op,l,r,x;i<=q;i++)
{
scanf("%lld",&op);
if(op==1)
{
scanf("%lld%lld%lld",&l,&r,&x);
cover_update(l,r,1,n,1,x);
}
else if(op==2)
{
scanf("%lld%lld%lld",&l,&r,&x);
add_update(l,r,1,n,1,x);
}
else
{
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,1,n,1));
}
}
return 0;
}