#include<bits/stdc++.h>
using namespace std;
int n,m,sum[1000000],a[1000000],op,xa,xy,k,tag[1000000];
long long lt(long long x){return x<<1;}
long long rt(long long x){
return x<<1|1;
}
void up(long long x){
sum[x]=max(sum[lt(x)],sum[rt(x)]);
}
void build(long long p,long long l,long long r){
if(l==r){
sum[p]=a[l];
return;
}
long long mid=l+r>>1;
build(lt(p),l,mid);
build(rt(p),mid+1,r);
up(p);
}
void f(long long k,long long p,long long l,long long r){
tag[p]+=k;
sum[p]+=k;
}
void push_down(long long l,long long r,long long p){
long long mid=l+r>>1;
f(tag[p],lt(p),l,mid);
f(tag[p],rt(p),mid+1,r);
tag[p]=0;
}
void ca(long long l,long long r,long long p,long long k,long long xa,long long xy){
if(l>=xa&&r<=xy){
tag[p]+=k;
sum[p]+=k;
return;
}
push_down(l,r,p);
long long mid=l+r>>1;
if(xa<=mid)ca(l,mid,lt(p),k,xa,xy);
if(xy>mid)ca(mid+1,r,rt(p),k,xa,xy);
up(p);
}
void cao(long long l,long long r,long long p,long long k,long long xa,long long xy){
if(l>=xa&&r<=xy){
tag[p]=0;
sum[p]=k;
return;
}
long long mid=l+r>>1;
if(xa<=mid)cao(l,mid,lt(p),k,xa,xy);
if(xy>mid)cao(mid+1,r,rt(p),k,xa,xy);
up(p);
}
long long query(long long l,long long r,long long p,long long xa,long long xy){
long long res=0;
if(l>=xa&&r<=xy)return sum[p];
push_down(l,r,p);
long long mid=l+r>>1;
if(xa<=mid)res=max(res,query(l,mid,lt(p),xa,xy));
if(xy>mid)res=max(res,query(mid+1,r,rt(p),xa,xy));
return res;
}
int main(){
cin>>n>>m;
memset(sum,-1000000,sizeof(sum));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&xa,&xy);
if(op==2){
scanf("%d",&k);
ca(1,n,1,k,xa,xy);
}
else if(op==1){
scanf("%d",&k);
cao(1,n,1,k,xa,xy);
}
else{
cout<<query(1,n,1,xa,xy)<<endl;
}
}
return 0;
}