#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,m,maxn=-1e18-1,a[2000010];
struct node{
int sum,add;
bool g=false;
}c[8000010];
void pushup(int k){
c[k].sum=max(c[k<<1].sum,c[k<<1|1].sum);
return;
}
void build(int k,int l,int r){
if(l==r){
c[k].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
return;
}
void pushdown(int k){
if(c[k].g){
c[k].add=0;
c[k].g=0;
c[k<<1].add=0;
c[k<<1].sum=c[k].sum;
c[k<<1].g=true;
c[k<<1|1].add=0;
c[k<<1|1].sum=c[k].sum;
c[k<<1|1].g=true;
return;
}
c[k<<1].add+=c[k].add;
c[k<<1].sum+=c[k].add;
c[k<<1|1].add+=c[k].add;
c[k<<1|1].sum+=c[k].add;
c[k].add=0;
pushup(k);
return;
}
void ope1(int k,int l,int r,int x,int y,int ll){
if(l>y||r<x)return;
if(l>=x&&r<=y){
c[k].add+=ll;
c[k].sum+=ll;
return;
}
pushdown(k);
int mid=(l+r)>>1;
ope1(k<<1,l,mid,x,y,ll);
ope1(k<<1|1,mid+1,r,x,y,ll);
pushup(k);
return;
}
void ope2(int k,int l,int r,int x,int y,int oo){
if(l>y||r<x)return;
if(l>=x&&r<=y){
c[k].add=0;
c[k].sum=oo;
c[k].g=true;
return;
}
pushdown(k);
int mid=(l+r)>>1;
ope2(k<<1,l,mid,x,y,oo);
ope2(k<<1|1,mid+1,r,x,y,oo);
pushup(k);
return;
}
void chaxun(int k,int l,int r,int x,int y){
if(l>y||r<x)return;
if(l>=x&&r<=y){
maxn=max(maxn,c[k].sum);
return;
}
int mid=(l+r)>>1;
chaxun(k<<1,l,mid,x,y);
chaxun(k<<1|1,mid+1,r,x,y);
return;
}
signed main(){
cin>>n>>m;
int op,l,r,x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>op;
if(op==1){
cin>>l>>r>>x;
ope2(1,1,n,l,r,x);
}else if(op==2){
cin>>l>>r>>x;
ope1(1,1,n,l,r,x);
}else{
cin>>l>>r;
chaxun(1,1,n,l,r);
cout<<maxn<<endl;
maxn=-1e18-1;
}
}
return 0;
}
20分真的调不出来了