#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define intmid long long mid=(l+r)>>1
using namespace std;
const int N=1011111;
const ll mi=-1e18;
int n,q,a[N];
ll tr[N<<2],lt[N<<2][3];
inline ll fr(){
ll 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<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
ll ls(ll k){
return k<<1;
}
ll rs(ll k){
return (k<<1)|1;
}
void pu(ll k){
tr[k]=tr[ls(k)] > tr[rs(k)] ? tr[ls(k)] : tr[rs(k)];
}
void pd(ll k){
if(lt[k][0]!=mi){
lt[ls(k)][0]=lt[k][0];
lt[rs(k)][0]=lt[k][0];
tr[ls(k)]=lt[k][0];
tr[rs(k)]=lt[k][0];
lt[rs(k)][1]=0;
lt[ls(k)][1]=0;
lt[k][0]=mi;
lt[k][1]=0;
return;
}
tr[ls(k)]+=lt[k][1];
tr[rs(k)]+=lt[k][1];
lt[ls(k)][1]+=lt[k][1];
lt[rs(k)][1]+=lt[k][1];
lt[k][1]=0;
}
void blind(ll k,ll l,ll r){
lt[k][0]=mi;
if(l==r){
tr[k]=a[l];
return;
}
intmid;
blind(ls(k),l,mid);
blind(rs(k),mid+1,r);
pu(k);
}
void ru(ll k,ll l,ll r,ll op,ll ul,ll ur,ll x){
if(ul > r || ur < l) return;
pd(k);
if(op^1){
if(ul <= l && ur >= r){
lt[k][1]+=x;
tr[k]+=x;
return;
}
intmid;
ru(ls(k),l,mid,op,ul,ur,x);
ru(rs(k),mid+1,r,op,ul,ur,x);
pu(k);
return;
}
if(ul <= l && ur >= r){
lt[k][0]=x;
tr[k]=x;
return;
}
intmid;
ru(ls(k),l,mid,op,ul,ur,x);
ru(rs(k),mid+1,r,op,ul,ur,x);
pu(k);
}
ll rq(ll k,ll l,ll r,ll ql,ll qr){
if(l > qr || r < ql) return mi;
pd(k);
if(l >= ql && r <= qr) return tr[k];
intmid;
return max(rq(ls(k),l,mid,ql,qr),rq(rs(k),mid+1,r,ql,qr));
}
int main(){
n=fr();q=fr();
for(int i=1;i<=n;i++){
a[i]=fr();
}
blind(1,1,n);
while(q--){
ll op=fr();
if(op==3){
ll ql=fr(),qr=fr();
cout<<rq(1,1,n,ql,qr);
putchar('\n');
}
else {
ll ul=fr(),ur=fr(),x=fr();
ru(1,1,n,op,ul,ur,x);
}
}
return 0;
}