#include<bits/stdc++.h>
using namespace std;
const long long N=1e6+5;
struct tree{
long long l,r,data,addl,chl;
}t[N<<2];
long long n,m,a[N];
long long ls(long long p){
return p<<1;
}
long long rs(long long p){
return p<<1|1;
}
void pushup(long long p){
t[p].data=max(t[ls(p)].data,t[rs(p)].data);
}
void pushdownc(long long p){
if(t[p].chl!=-0x3f3f3f3f){
t[ls(p)].addl=0;
t[rs(p)].addl=0;
t[ls(p)].data=t[rs(p)].data=t[p].chl;
t[ls(p)].chl=t[rs(p)].chl=t[p].chl;
t[p].chl=-0x3f3f3f3f;
}
}
void pushdowna(long long p){
if(t[p].addl){
pushdownc(p);
t[ls(p)].data+=t[p].addl;
t[rs(p)].data+=t[p].addl;
t[ls(p)].addl+=t[p].addl;
t[rs(p)].addl+=t[p].addl;
t[p].addl=0;
}
}
void pushdown(long long p){
pushdownc(p);
pushdowna(p);
}
void build(long long p,long long l,long long r){
t[p].l=l;t[p].r=r;
t[p].chl=-0x3f3f3f3f;
t[p].addl=0;
if(t[p].l==t[p].r){
t[p].data=a[l];
return ;
}
long long mid=(t[p].l+t[p].r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void add(long long p,long long l,long long r,long long k){
if(t[p].l>=l&&t[p].r<=r){
pushdownc(p);
t[p].addl+=k;
t[p].data+=k;
return ;
}
pushdown(p);
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid) add(ls(p),l,r,k);
if(mid<r) add(rs(p),l,r,k);
pushup(p);
}
void change(long long p,long long l,long long r,long long k){
if(t[p].l>=l&&t[p].r<=r){
t[p].chl=k;
t[p].data=k;
t[p].addl=0;
return ;
}
pushdown(p);
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid) change(ls(p),l,r,k);
if(mid<r) change(rs(p),l,r,k);
pushup(p);
}
long long query(long long p,long long l,long long r){
if(t[p].l>=l&&t[p].r<=r){
return t[p].data;
}
pushdown(p);
long long ans=-0x7fffffff;
long long mid=(t[p].l+t[p].r)/2;
if(l<=mid) ans=max(ans,query(ls(p),l,r));
if(mid<r) ans=max(ans,query(rs(p),l,r));
return ans;
}
int main(){
cin>>n>>m;
for(long long i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
long long o,k,u,v;
cin>>o>>u>>v;
if(o==1){
cin>>k;
change(1,u,v,k);
}
else if(o==2){
cin>>k;
add(1,u,v,k);
}
else if(o==3){
cout<<query(1,u,v)<<'\n';
}
}
}
#6#7#8#9WA,#10RE,使用AI调了但是并无【】用,故求助谷民