#include <bits/stdc++.h>
#define int long long
#define un unsigned
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;}
const int N = 1e6+5;
const int MIN=LLONG_MIN;
int sum[4*N],tag1[4*N],tag2[4*N],a[N];
int ls(int x){
return x<<1;
}
int rs(int x){
return x<<1|1;
}
void add1(int x,int l,int r,int k){
sum[x]+=k;
tag1[x]+=k;
}
void add2(int x,int l,int r,int k){
sum[x]=k;
tag2[x]=k;
}
void pushdown(int x,int l,int r){
int mid=(l+r)>>1;
if(tag2[x]!=MIN){
tag1[ls(x)]=tag1[rs(x)]=0;
add2(ls(x),l,mid,tag2[x]);
add2(rs(x),mid+1,r,tag2[x]);
tag2[x]=MIN;
}
if(tag1[x]!=0){
add1(ls(x),l,mid,tag1[x]);
add1(rs(x),mid+1,r,tag1[x]);
tag1[x]=0;
}
}
void pushup(int x){
sum[x]=max(sum[ls(x)],sum[rs(x)]);
return;
}
void build(int x,int l,int r){
tag2[x]=MIN;
if(l==r){
sum[x]=a[l];
return;
}
int mid = (l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x);
return;
}
void update(int x,int l,int r,int L,int R,int k){
if(L<=l && r<=R){
add1(x,l,r,k);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid) update(ls(x),l,mid,L,R,k);
if(mid<R) update(rs(x),mid+1,r,L,R,k);
pushup(x);
}
void update1(int x,int l,int r,int L,int R,int k){
if(L<=l && r<=R){
add2(x,l,r,k);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(L<=mid) update1(ls(x),l,mid,L,R,k);
if(mid<R) update1(rs(x),mid+1,r,L,R,k);
pushup(x);
}
int query(int x,int l,int r,int L,int R){
if(L<=l && r<=R){
return sum[x];
}
pushdown(x,l,r);
int mid=(l+r)>>1;
int ret = MIN;
if(L<=mid) ret=max(ret,query(ls(x),l,mid,L,R));
if(mid<R) ret=max(ret,query(rs(x),mid+1,r,L,R));
return ret;
}
int n,q;
signed main(){
n=read();q=read();
for(int i = 1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
while(q--){
int opt;
opt=read();
int l,r;
l=read();r=read();
if(opt==1){
int x;x=read();
update1(1,1,n,l,r,x);
}
else if(opt==2){
int x;x=read();
update(1,1,n,l,r,x);
}
else{
cout<<query(1,1,n,l,r)<<"\n";
}
}
return 0;
}
WA#7-#10 感觉所有的错误都注意到了