#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=5e6,INF=114514520606060606;
ll T[N],la1[N],la2[N];
ll n,m;
inline ll read()
{
ll x=0,f=1; char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while (isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
inline ll ma (ll a,ll b)
{
return (a>=b)?a:b;
}
void build (ll i,ll l,ll r,ll k,ll x)
{
if (l==r) {
T[i]=x;
return ;
}
ll mid=(l+r)>>1;
if (k<=mid) build(i<<1,l,mid,k,x);
else build(i<<1|1,mid+1,r,k,x);
T[i]=ma(T[i<<1],T[i<<1|1]);
}
void push_down (ll i)
{
if (la1[i]!=INF) {
la1[i<<1]=la1[i<<1|1]=la1[i];
la2[i<<1]=la2[i<<1|1]=0;
T[i<<1]=T[i<<1|1]=la1[i];
la1[i]=INF;
}
if (la2[i]!=0) {
la2[i<<1]+=la2[i];
la2[i<<1|1]+=la2[i];
T[i<<1]+=la2[i];
T[i<<1|1]+=la2[i];
la2[i]=0;
}
}
void change (ll i,ll l,ll r,ll L,ll R,ll x,ll f)
{
if (L<=l && r<=R) {
if (f==1) {
T[i]=x;
la1[i]=x;
}
else {
T[i]+=x;
la2[i]+=x;
}
push_down(i);
return ;
}
push_down(i);
ll mid=(l+r)>>1;
if (L<=mid) change(i<<1,l,mid,L,R,x,f);
if (R>mid) change(i<<1|1,mid+1,r,L,R,x,f);
T[i]=ma(T[i<<1],T[i<<1|1]);
}
ll query (ll i,ll l,ll r,ll L,ll R)
{
if (L<=l && r<=R) return T[i];
push_down(i);
ll mid=(l+r)>>1,x1=-INF,x2=-INF;
if (L<=mid) x1=query(i<<1,l,mid,L,R);
if (R>mid) x2=query(i<<1|1,mid+1,r,L,R);
return ma(x1,x2);
}
int main()
{
freopen("P1253_7.in","r",stdin);
n=read(); m=read();
for (ll i=0;i<=5*n;i++) la1[i]=INF;
for (ll i=1;i<=n;i++) {
ll a=read();
build(1,1,n,i,a);
}
for (ll i=1;i<=m;i++) {
ll f=read(),l=read(),r=read(),x=0;
if (f==1 || f==2) {
x=read();
change(1,1,n,l,r,x,f);
}
else printf("%lld\n",query(1,1,n,l,r));
}
return 0;
}