#include<bits/stdc++.h>
#define ls(id) ((id)<<1)
#define rs(id) (((id)<<1)|1)
#define mid (((l)+(r))>>1)
#define ll long long
#define none -1e18
#define enter putchar('\n')
#define space putchar(' ')
using namespace std;
const int maxn = 1e6+7;
#define int ll
template<typename T>void read(T& n)
{
T f=1,k=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
n=f*k;
}
template<typename T>void write(T x)
{
if(x==0){putchar('0');return;}
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
}
ll arr[maxn<<1],tree[maxn<<2],lazy[maxn<<2],lazy2[maxn<<2];
void build(int id,int l,int r) {
lazy2[id]=none;
if(l==r) {
tree[id]=arr[l];
return;
}
build(ls(id),l,mid);
build(rs(id),mid+1,r);
tree[id]=max(tree[ls(id)],tree[rs(id)]);
return;
}
void ad(int id,ll k,int l,int r) {
tree[id]+=k;
lazy[id]+=k;
return;
}
void ch(int id,ll k,int l,int r) {
tree[id]=k;
lazy2[id]=k;
lazy[id]=0;
return;
}
void push_down(int id,int l,int r) {
if(lazy2[id]!=none) {
ch(ls(id),lazy2[id],l,mid);
ch(rs(id),lazy2[id],mid+1,r);
}
if(lazy[id]) {
ad(ls(id),lazy[id],l,mid);
ad(rs(id),lazy[id],mid+1,r);
}
lazy2[id]=none;
lazy[id]=0;
return;
}
void add(int id,ll k,int l,int r,int dl,int dr) {
if(dl<=l&&dr>=r) {
ad(id,k,l,r);
return;
}
push_down(id,l,r);
if(dl<=mid)
add(ls(id),k,l,mid,dl,dr);
if(dr>mid)
add(rs(id),k,mid+1,r,dl,dr);
tree[id]=max(tree[ls(id)],tree[rs(id)]);
return;
}
void change(int id,ll k,int l,int r,int dl,int dr) {
if(dl<=l&&dr>=r) {
ch(id,k,l,r);
return;
}
push_down(id,l,r);
if(dl<=mid)
change(ls(id),k,l,mid,dl,dr);
if(dr>mid)
change(rs(id),k,mid+1,r,dl,dr);
tree[id]=max(tree[ls(id)],tree[rs(id)]);
return;
}
ll check(int id,int l,int r,int x,int y) {
push_down(id,l,r);
if(l>=x&&r<=y) {
return tree[id];
}
int ans=-1e18;
if(x<=mid)
ans=max(ans,check(ls(id),l,mid,x,y));
if(y>mid)
ans=max(ans,check(rs(id),mid+1,r,x,y));
return ans;
}
int cnt;
int n,m,k,id;
signed main() {
read(n);read(m);
int com,l,r,k;
for(int i=1;i<=n;++i)
read(arr[i]);
build(1,1,n);
for(int i=1;i<=m;++i) {
read(com);read(l);read(r);
if(com==2){
read(k);
add(1,k,1,n,l,r);
}
else if(com==1){
read(k);
change(1,k,1,n,l,r);
}
else {
write(check(1,1,n,l,r)),enter;
}
}
return 0;
}