// freopen (".in", "r", stdin);
// freopen (".out", "w", stdout);
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int xr=0,F=1; char cr;
while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
inline void write(int n)
{
if(n==0) return;
write(n/10);
putchar(n%10+'0');
}
int n,m;
int a[1000005];
struct AA
{
int l,r,mx,lazy1,lazy2,used;
}t[40000005];
void build(int l,int r,int i)
{
t[i].l=l;
t[i].r=r;
t[i].mx=-1e18;
if(l==r)
{
t[i].mx=a[l];
return;
}
int mid=l+r>>1;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
t[i].mx=max(t[i*2].mx,t[i*2+1].mx);
}
void lazytap(int i)
{
if(t[i].used)
{
t[i*2].lazy1=t[i].lazy1;
t[i*2+1].lazy1=t[i].lazy1;
t[i*2].lazy2=t[i].lazy2;
t[i*2+1].lazy2=t[i].lazy2;
t[i*2].used=1;
t[i*2+1].used=1;
t[i*2].mx=t[i].lazy1+t[i].lazy2;
t[i*2+1].mx=t[i].lazy1+t[i].lazy2;
}
else
{
t[i*2].lazy2+=t[i].lazy2;
t[i*2+1].lazy2+=t[i].lazy2;
t[i*2].mx+=t[i].lazy2;
t[i*2+1].mx+=t[i].lazy2;
}
t[i].lazy1=0;
t[i].lazy2=0;
t[i].used=0;
}
void change(int l,int r,int k,int i)
{
if(t[i].l>=l&&t[i].r<=r)
{
t[i].lazy1=k;
t[i].lazy2=0;
t[i].mx=k;
t[i].used=1;
return;
}
lazytap(i);
int mid=t[i].l+t[i].r>>1;
if(l<=mid)change(l,r,k,i*2);
if(r>mid)change(l,r,k,i*2+1);
t[i].mx=max(t[i*2].mx,t[i*2+1].mx);
}
void update(int l,int r,int k,int i)
{
if(t[i].l>=l&&t[i].r<=r)
{
t[i].lazy2+=k;
t[i].mx+=k;
return;
}
lazytap(i);
int mid=t[i].l+t[i].r>>1;
if(l<=mid)change(l,r,k,i*2);
if(r>mid)change(l,r,k,i*2+1);
t[i].mx=max(t[i*2].mx,t[i*2+1].mx);
}
int ask(int l,int r,int i)
{
if(t[i].l>=l&&t[i].r<=r)
{
return t[i].mx;
}
lazytap(i);
int mid=t[i].l+t[i].r>>1;
int ans=-1e18;
if(l<=mid)ans=max(ans,ask(l,r,i*2));
if(r>mid)ans=max(ans,ask(l,r,i*2+1));
return ans;
}
signed main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
build(1,n,1);
while(m--)
{
int op;
op=read();
if(op==1)
{
int l,r,k;
l=read(),r=read(),k=read();
change(l,r,k,1);
}
if(op==2)
{
int l,r,k;
l=read(),r=read(),k=read();
update(l,r,k,1);
}
if(op==3)
{
int l,r;
l=read(),r=read();
cout<<ask(l,r,1);
printf("\n");
}
}
return 0;
}