并且re一个点
#include<bits/stdc++.h>
#define int long long
#define lc x<<1
#define rc ((x<<1)|1)
#define mid (l+r>>1)
#define none -11451419
using namespace std;
const int N=1e6+10;
int a[N],n,m;
inline int r(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return f*x;
}
struct Node{
int l,r,add,maxx,sum,cover;
}tr[N<<2];
void pushup(int x){
tr[x].sum=tr[lc].sum+tr[rc].sum;
tr[x].maxx=max(tr[lc].maxx,tr[rc].maxx);
}
void build(int x,int l,int r){
if(l==r){
tr[x].maxx=a[l];
tr[x].sum=a[l];
tr[x].cover=none;
return ;
}
build(lc,l,mid);
build(rc,mid+1,r);
pushup(x);
}
void coverdown(int x){
if(tr[x].cover !=none){
tr[lc].sum=tr[rc].sum=0;
tr[lc].maxx=tr[rc].maxx=tr[x].cover;
tr[lc].cover=tr[rc].cover=tr[x].cover;
tr[x].cover=none;
}
}
void pushdown(int x,int l,int r){
int v=tr[x].add;
tr[lc].add+=v,tr[rc].add+=v;
tr[x].add=0;
tr[lc].sum+=(mid-l+1)*v,tr[rc].sum+=(r-mid)*v;
tr[x].maxx=max(tr[lc].maxx,tr[rc].maxx);
coverdown(x);
}
void coveradd(int x,int l,int r,int from,int to,int v){
if(from<=l&&to>=r){
tr[x].sum=0;
tr[x].maxx=v;
tr[x].cover=v;
return ;
}
pushdown(x,l,r);
if(from<=mid)coveradd(lc,l,mid,from,to,v);
if(to>=mid+1)coveradd(rc,mid+1,r,from,to,v);
pushup(x);
}
void change(int x,int l,int r,int from,int to,int v){
if(from<=l&&r<=to){
coverdown(x);
tr[x].add+=v,tr[x].maxx+=v;
return ;
}
pushdown(x,l,r);
if(from<=mid)change(lc,l,mid,from,to,v);
if(to>mid)change(rc,mid+1,r,from,to,v);
pushup(x);
}
int query(int x,int l,int r,int from,int to){
if(from<=l&&r<=to){
return tr[x].maxx;
}
pushdown(x,l,r);
int res=-114514;
if(from<=mid)res=max(res,query(lc,l,mid,from,to));
if(to>mid)res=max(res,query(rc,mid+1,r,from,to));
return res;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int op,xx,yy,k;
cin>>op;
if(op==1){
xx=r(),yy=r(),k=r();
coveradd(1,1,n,xx,yy,k);
}
if(op==2){
xx=r(),yy=r(),k=r();
change(1,1,n,xx,yy,k);
}
if(op==3){
xx=r(),yy=r();
cout<<query(1,1,n,xx,yy)<<endl;
}
}
return 0;
}