#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6 + 10;
#define INF 209833298937876897
ll a[N];
ll tree[N<<2];
ll tag_chg[N<<2];
ll tag_add[N<<2];
ll ls(ll p){ return p<<1; }
ll rs(ll p){ return p<<1|1;}
void push_up(ll p){
tree[p] = max(tree[ls(p)], tree[rs(p)]);
}
void build(ll p,ll pl,ll pr){
tag_chg[p]=-INF;
if(pl==pr){tree[p]=a[pl]; return;}
ll mid = (pl+pr) >> 1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void make_tag(ll p){
if(tag_chg[p]!=-INF)tree[p]=tag_chg[p]+tag_add[p];
else tree[p]+=tag_add[p];
}
void cvr_down(ll p){
if(tag_chg[p]!=-INF){
tag_chg[ls(p)]=tag_chg[rs(p)]=tag_chg[p]+tag_add[p];
tag_add[ls(p)]=tag_add[rs(p)]=0;
make_tag(ls(p));
make_tag(rs(p));
tag_chg[p]=-INF;
tag_add[p]=0;
}
}
void sum_down(ll p){
if(tag_add[p]){
cvr_down(ls(p));
cvr_down(rs(p));
tag_add[ls(p)]+=tag_add[p];
tag_add[rs(p)]+=tag_add[p];
tree[ls(p)]+=tag_add[p];
tree[rs(p)]+=tag_add[p];
tag_add[p]=0;
}
}
void push_down(ll p){
cvr_down( p);
sum_down(p);
}
void update_add(ll L,ll R,ll p,ll pl,ll pr,ll d){
if(L<=pl && pr<=R){
tag_add[p]+=d;
tree[p]+=d;
return;
}
push_down(p);
ll mid=(pl+pr)>>1;
if(L<=mid) update_add(L,R,ls(p),pl,mid,d);
if(R>mid) update_add(L,R,rs(p),mid+1,pr,d);
push_up(p);
}
void update_chg(ll L,ll R,ll p,ll pl,ll pr,ll d){
if(L<=pl && pr<=R){
tree[p]=d;
tag_chg[p]=d;
tag_add[p]=0;
return;
}
push_down(p);
ll mid=(pl+pr)>>1;
if(L<=mid) update_chg(L,R,ls(p),pl,mid,d);
if(R>mid) update_chg(L,R,rs(p),mid+1,pr,d);
push_up(p);
}
ll query(ll L,ll R,ll p,ll pl,ll pr){
if(pl>=L && R >= pr) {
return tree[p];
}
push_down(p);
ll res=-INF;
ll mid = (pl+pr)>>1;
if(L<=mid) res=max(res,query(L,R,ls(p),pl,mid));
if(R>mid) res=max(res,query(L,R,rs(p),mid+1,pr));
return res;
}
int main(){
ll n, m; scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
ll q,L,R,d;
scanf("%lld",&q);
if (q==1){
scanf("%lld %lld %lld",&L,&R,&d);
update_chg(L,R,1,1,n,d);
}else if(q==2){
scanf("%lld %lld %lld",&L,&R,&d);
update_add(L,R,1,1,n,d);
}
else {
scanf("%lld %lld",&L,&R);
printf("%lld\n",query(L,R,1,1,n));
}
}
return 0;
}