#include<bits/stdc++.h>
using namespace std;
struct segmentree{
long long l,r;
long long add;
long long mx;
long long modify,flag;
#define l(p) tree[p].l
#define r(p) tree[p].r
#define mx(p) tree[p].mx
#define add(p) tree[p].add
#define modify(p) tree[p].modify
#define flag(p) tree[p].flag
}tree[1000000*4+10];
long long a[1000010];
long long n,m;
long long max(long long x,long long y){
if(x>y) return x;
else return y;
}
void build(long long p,long long l,long long r){
l(p)=l,r(p)=r;
if(l==r){
mx(p)=a[l];
return;
}
long long mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
mx(p)=max(mx(p<<1),mx(p<<1|1));
}
void spread(long long p){
if(flag(p)){
mx(p<<1)=modify(p);
mx(p<<1|1)=modify(p);
modify(p<<1)=modify(p);
modify(p<<1|1)=modify(p);
add(p<<1)=0;
add(p<<1|1)=0;
flag(p<<1|1)=1;
flag(p<<1)=1;
flag(p)=0;
}
if(add(p)){
mx(p<<1)+=add(p);
add(p<<1)+=add(p);
mx(p<<1|1)+=add(p);
add(p<<1|1)+=add(p);
add(p)=0;
}
}
long long ask(long long p,long long l,long long r){
if(l<=l(p)&&r>=r(p)){
return mx(p);
}
long long ans=-1e18;
spread(p);
long long mid=(l(p)+r(p))>>1;
if(l<mid) ans=max(ask(p<<1,l,mid),ans);
if(r>mid) ans=max(ask(p<<1|1,mid+1,r),ans);
return ans;
}
void change1(long long p,long long l,long long r,long long d){
if(l<=l(p)&&r>=r(p)){
mx(p)=d;
modify(p)=d;
add(p)=0;
flag(p)=1;
return;
}
spread(p);
long long mid=(l(p)+r(p))>>1;
if(l<mid) change1(p<<1,l,mid,d);
if(r>mid) change1(p<<1|1,mid+1,r,d);
mx(p)=max(mx(p<<1),mx(p<<1|1));
}
void change2(long long p,long long l,long long r,long long d){
if(l<=l(p)&&r>=r(p)){
mx(p)+=d;
add(p)+=d;
return;
}
spread(p);
long long mid=(l(p)+r(p))>>1;
if(l<mid) change2(p<<1,l,mid,d);
if(r>mid) change2(p<<1|1,mid+1,r,d);
mx(p)=max(mx(p<<1),mx(p<<1|1));
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
build(1,1,n);
for(long long i=1;i<=m;i++){
long long op;
scanf("%lld",&op);
if(op==1){
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
change1(1,x,y,k);
}else if(op==2){
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
change2(1,x,y,k);
}else {
long long x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",ask(1,x,y));
}
}
return 0;
}