#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fa tree[k]
#define ls tree[k<<1]
#define rs tree[k<<1|1]
const int N=1e6;
const int inf=1145141919810;
int n,q;
int a[4*N+5];
struct node
{
int l,r;
int maxx;
int adtag,chtag;
}tree[4*N+5];
void push_down(int k)
{
int tag;
if(fa.chtag!=-inf)
{
tag=fa.chtag;
ls.adtag=rs.adtag=0;
ls.maxx=rs.maxx=tag;
ls.chtag=rs.chtag=tag;
fa.chtag=-inf;
}
tag=fa.adtag;
ls.adtag+=tag;
rs.adtag+=tag;
ls.maxx+=tag;
rs.maxx+=tag;
fa.adtag=0;
return ;
}
void build(int k,int l,int r)
{
fa.l=l,fa.r=r;
fa.adtag=0,fa.chtag=-inf;
if(l==r)
{
fa.maxx=a[l];
return ;
}
int mid=(fa.l+fa.r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
fa.maxx=max(ls.maxx,rs.maxx);
return ;
}
void add(int k,int l,int r,int x)
{
if(fa.l>=l && fa.r<=r)
{
fa.adtag+=x;
fa.maxx+=x;
return ;
}
push_down(k);
int mid=(fa.l+fa.r)>>1;
if(mid>=l)
add(k<<1,l,r,x);
if(mid+1<=r)
add(k<<1|1,l,r,x);
fa.maxx=max(ls.maxx,rs.maxx);
return ;
}
void change(int k,int l,int r,int x)
{
if(fa.l>=l && fa.r<=r)
{
fa.chtag=x;
fa.maxx=x;
fa.adtag=0;
return ;
}
push_down(k);
int mid=(fa.l+fa.r)>>1;
if(mid>=l)
change(k<<1,l,r,x);
if(mid+1<=r)
change(k<<1|1,l,r,x);
fa.maxx=max(ls.maxx,rs.maxx);
return ;
}
int ask(int k,int l,int r)
{
int ans=0;
if(fa.l>=l && fa.r<=r)
return fa.maxx;
push_down(k);
int mid=(fa.l+fa.r)>>1;
if(mid>=l)
ans=max(ans,ask(k<<1,l,r));
if(mid+1<=r)
ans=max(ans,ask(k<<1|1,l,r));
// fa.maxx=max(ls.maxx,rs.maxx);
return ans;
}
signed main()
{
// freopen("P1253_6 (1).in","r",stdin);
// freopen("my.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(q--)
{
int op,x,y,z;
cin>>op>>x>>y;
if(op==1)
{
cin>>z;
change(1,x,y,z);
}
if(op==2)
{
cin>>z;
add(1,x,y,z);
}
if(op==3)
{
cout<<ask(1,x,y)<<"\n";
}
}
return 0;
}