#include <bits/stdc++.h>
#define int long long
#define minn -9223372036854775807
using namespace std;
struct str{
int l,r,v,add,revise;
}tr[4000005];
int a[1000005];
void pushup(int p) {
tr[p].v=max(tr[p<<1].v,tr[p<<1|1].v);
}
void pushdown(int p) {
int mid=(tr[p].l+tr[p].r)>>1;
if(tr[p].revise!=minn){
tr[p<<1].v=tr[p].revise;
tr[p<<1|1].v=tr[p].revise;
tr[p<<1].revise=tr[p].revise;
tr[p<<1|1].revise=tr[p].revise;
}
if(tr[p].add!=0){
tr[p<<1].v+=tr[p].add;
tr[p<<1|1].v+=tr[p].add;
tr[p<<1].add+=tr[p].add;
tr[p<<1|1].add+=tr[p].add;
}
tr[p].revise=minn;
tr[p].add=0;
}
void build(int p,int x,int y) {
tr[p].l=x;
tr[p].r=y;
tr[p].revise=minn;
tr[p].add=0;
if(x==y){
tr[p].v=a[x];
return;
}
int mid=(x+y)>>1;
build(p<<1,x,mid);
build(p<<1|1,mid+1,y);
pushup(p);
}
void update_revise(int p,int x,int y,int k) {
if(x<=tr[p].l&&tr[p].r<=y) {
tr[p].v=k;
tr[p].revise=k;
tr[p].add=0;
return;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(x<=mid){
update_revise(p<<1,x,y,k);
}
if(y>mid){
update_revise(p<<1|1,x,y,k);
}
pushup(p);
}
void update_add(int p,int x,int y,int k) {
if(x<=tr[p].l&&tr[p].r<=y) {
tr[p].v+=k;
tr[p].add+=k;
return;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(x<=mid){
update_add(p<<1,x,y,k);
}
if(y>mid){
update_add(p<<1|1,x,y,k);
}
pushup(p);
}
void debug(){
for(int i=1;i<=7;i++){
cout<<i<<" "<<tr[i].l<<" "<<tr[i].r<<" "<<tr[i].v<<endl;
}
}
int query(int p,int x,int y) {
if(x<=tr[p].l&&tr[p].r<=y){
return tr[p].v;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
int maxn=minn;
if(x<=mid){
maxn=max(maxn,query(p<<1,x,y));
}
if(y>mid){
maxn=max(maxn,query(p<<1|1,x,y));
}
return maxn;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int f;
cin>>f;
if(f==1){
int x,y,k;
cin>>x>>y>>k;
update_revise(1,x,y,k);
}
if(f==2){
int x,y,k;
cin>>x>>y>>k;
update_add(1,x,y,k);
}
if(f==3){
int x,y;
cin>>x>>y;
cout<<query(1,x,y)<<"\n";
}
}
}