#include<bits/stdc++.h>
using namespace std;
long long n,tri[4640000],lazy[4640000],cazy[4640000];
const long long NOCAZY=0x9d9d9d9d9d9d9d9d;
void PushDown(int x,int a,int b)
{
int mid=(a+b)/2;
if(cazy[2*x]==NOCAZY)
{
tri[2*x]+=lazy[x];
lazy[2*x]+=lazy[x];
}
else
{
cazy[2*x]=cazy[x];
tri[2*x]=cazy[x];
}
if(cazy[2*x+1]==NOCAZY)
{
tri[2*x+1]+=lazy[x];
lazy[2*x+1]+=lazy[x];
}
else
{
cazy[2*x]=cazy[x];
tri[2*x]=cazy[x];
}
if(cazy[x]!=NOCAZY) tri[x]=cazy[x];
cazy[x]=NOCAZY;
lazy[x]=0;
}
void ChangeEdge(int x,int a,int b,int l,int r,int k)
{
int mid=(a+b)/2;
if(a==l&&b==r)
{
tri[x]=k;
cazy[x]=k;
return;
}
PushDown(x,a,b);
if(cazy[x]!=NOCAZY)
lazy[2*x]=lazy[2*x+1]=0;
cazy[x]=NOCAZY;
lazy[x]=0;
if(mid<=l) ChangeEdge(2*x+1,mid,b,l,r,k);
if(mid>=r) ChangeEdge(2*x,a,mid,l,r,k);
if(mid>l&&mid<r)
{
ChangeEdge(2*x,a,mid,l,mid,k);
ChangeEdge(2*x+1,mid,b,mid,r,k);
}
tri[x]=max(tri[2*x],tri[2*x+1]);
}
void AddEdge(int x,int a,int b,int l,int r,int k)
{
int mid=(a+b)/2;
if(a==l&&b==r)
{
tri[x]+=k;
return;
}
PushDown(x,a,b);
if(mid<=l) AddEdge(2*x+1,mid,b,l,r,k);
if(mid>=r) AddEdge(2*x,a,mid,l,r,k);
if(mid>l&&mid<r)
{
AddEdge(2*x,a,mid,l,mid,k);
AddEdge(2*x+1,mid,b,mid,r,k);
}
tri[x]=max(tri[2*x],tri[2*x+1]);
}
long long S(int x,int a,int b,int l,int r)
{
int mid=(a+b)/2;
if(a==l&&b==r) return tri[x];
PushDown(x,a,b);
int now;
if(mid<=l) now=S(2*x+1,mid,b,l,r);
if(mid>=r) now=S(2*x,a,mid,l,r);
if(mid>l&&mid<r)
now=max(S(2*x,a,mid,l,mid),S(2*x+1,mid,b,mid,r));
tri[x]=max(tri[2*x],tri[2*x+1]);
return now;
}
void Debug()
{
for(int i=1;i<=4*n;i++)
printf("%lld ",tri[i]);
puts("");
for(int i=1;i<=4*n;i++)
printf("%lld ",cazy[i]);
for(int i=1;i<=4*n;i++)
printf("%lld ",lazy[i]);
}
int main()
{
memset(cazy,0x9d,sizeof(cazy));
int T;
scanf("%lld%d",&n,&T);
for(int i=1;i<=n;i++)
{
long long x;
scanf("%lld",&x);
AddEdge(1,1,n+1,i,i+1,x);
}
while(T--)
{
int op;
scanf("%d",&op);
if(op==1)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
ChangeEdge(1,1,n+1,x,y+1,z);
}
if(op==2)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
AddEdge(1,1,n+1,x,y+1,z);
}
if(op==3)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",S(1,1,n+1,x,y+1));
}
}
return 0;
}