#include<iostream>
#include<string>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<set>
#include<iomanip>
#include<cstdio>
#include<queue>
#include <climits>
#include<stack>
#include<deque>
using namespace std;
#define int long long
const int N = 1e7+10;
const int INF = LONG_MIN;
#define ls id<<1
#define rs id<<1|1
int a[N],n,m;
struct node{
int l,r,sum,lazy;
int clazy;
}tr[N];
void push_up(int id){
tr[id].sum=max(tr[ls].sum,tr[rs].sum);
}
void push_down(int id){
if(tr[id].lazy!=0){
tr[ls].sum+=tr[id].lazy;
tr[rs].sum+=tr[id].lazy;
tr[ls].lazy+=tr[id].lazy,tr[rs].lazy+=tr[id].lazy;
tr[id].lazy=0;
}
if(tr[id].clazy!=INF){
tr[ls].sum=tr[id].clazy;
tr[rs].sum=tr[id].clazy;
tr[ls].clazy=tr[id].clazy,tr[rs].clazy=tr[id].clazy;
tr[id].clazy=INF;
tr[id].lazy=0;
}
}
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r;
tr[id].lazy=0,tr[id].sum=0,tr[id].clazy=INF;
if(l==r){
tr[id].sum=a[l];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
push_up(id);
}
void change(int id,int l,int r,int k){
if(tr[id].l>r||tr[id].r<l)return ;
if(tr[id].l>=l&&tr[id].r<=r){
tr[id].sum=k;
tr[id].lazy=0;
tr[id].clazy=k;
return ;
}
if(tr[id].lazy!=0||tr[id].clazy!=INF)push_down(id);
change(ls,l,r,k);
change(rs,l,r,k);
push_up(id);
}
void add(int id,int l,int r,int k){
if(tr[id].l>r||tr[id].r<l)return ;
if(tr[id].l>=l&&tr[id].r<=r){
tr[id].sum+=k;
tr[id].lazy+=k;
return ;
}
if(tr[id].lazy||tr[id].clazy!=INF)push_down(id);
add(ls,l,r,k);
add(rs,l,r,k);
push_up(id);
}
int calc(int id,int l,int r){
if(tr[id].l>r||tr[id].r<l)return INF;
if(tr[id].l>=l&&tr[id].r<=r){ return tr[id].sum; }
if(tr[id].lazy!=0||tr[id].clazy!=INF)push_down(id);
return max(calc(ls,l,r),calc(rs,l,r));
}
signed main(){
//freopen("","r",stdin);
//freopen("","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
while(m--){
int opt,x,y,z;
cin>>opt>>x>>y;
if(opt==1){
cin>>z;
change(1,x,y,z);
}
else if(opt==2){
cin>>z;
add(1,x,y,z);
}
else {
cout<<calc(1,x,y)<<endl;
}
}
return 0;
}
玄关