#include<bits/stdc++.h>
#define ll long long
#define un unsigned
using namespace std;
template<typename T> inline void read(T &x){
x=0;char c=getchar();bool flag=false;
while(!isdigit(c)){if(c=='-')flag=true;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
if(flag)x=-x;
}
template<typename T> inline void write(T x){
short st[30],tp=0;
if(x<0) putchar('-'),x=-x;
do st[++tp]=x%10,x/=10; while(x);
while(tp) putchar('0'|st[tp--]);
}
#define wr write
#define rd read
#define pk putchar(' ')
#define ed puts("")
#define ls(p) p<<1
#define rs(p) p<<1|1
const int MAXN=1e6+10;
const ll INF=1145141981;
struct ltree{
int l,r;
ll maxn,tag1,tag2;
}t[4*MAXN];
ll a[MAXN];
void make(int p,int nl,int nr){
t[p].tag2=-INF;
t[p].tag1=0;
t[p].l=nl;
t[p].r=nr;
//cout<<p<<" "<<nl<<" "<<nr<<endl;
if(nl==nr){
t[p].maxn=a[nl];
t[p].tag1=0;
t[p].tag2=-INF;
return;
}
int mid=(nl+nr)>>1;
make(ls(p),nl,mid);
make(rs(p),mid+1,nr);
t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
void pushdown1(int p){
if(t[p].tag2!=-INF){
//cout<<"!!!"<<endl;
t[ls(p)].tag1=t[rs(p)].tag1=0;
t[ls(p)].maxn=t[rs(p)].maxn=t[p].tag2;
t[ls(p)].tag2=t[rs(p)].tag2=t[p].tag2;
t[p].tag2=-INF;
}
}
void pushdown2(int p){
if(t[p].tag1!=0){
pushdown1(p);
t[ls(p)].maxn+=t[p].tag1;
t[rs(p)].maxn+=t[p].tag1;
t[ls(p)].tag1+=t[p].tag1;
t[rs(p)].tag1+=t[p].tag1;
t[p].tag1=0;
}
}
void add(int p,int ql,int qr,int num){
//cout<<p<<" "<<t[p].l<<" "<<t[p].r<<endl;
if(t[p].l>=ql&&t[p].r<=qr){
pushdown1(p);
t[p].maxn+=num;
t[p].tag1+=num;
return;
}
pushdown1(p);
pushdown2(p);
int mid=(t[p].r+t[p].l)>>1;
if(ql<=mid) add(ls(p),ql,qr,num);
if(qr>mid) add(rs(p),ql,qr,num);
t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
void cover(int p,int ql,int qr,int num){
if(t[p].l>=ql&&t[p].r<=qr){
t[p].tag1=0;
t[p].maxn=num;
t[p].tag2=num;
return;
}
pushdown1(p);
pushdown2(p);
int mid=(t[p].r+t[p].l)>>1;
if(ql<=mid) cover(ls(p),ql,qr,num);
if(qr>mid) cover(rs(p),ql,qr,num);
t[p].maxn=max(t[ls(p)].maxn,t[rs(p)].maxn);
}
int query(int p,int ql,int qr){
if(t[p].l==t[p].r) return t[p].maxn;
pushdown1(p);
pushdown2(p);
//cout<<p<<" "<<t[p].maxn<<endl;
int mid=(t[p].l+t[p].r)>>1,ans=-INF;
if(ql<=mid) ans=max(ans,query(ls(p),ql,qr));
if(qr>mid) ans=max(ans,query(rs(p),ql,qr));
return ans;
}
signed main(){
int n,m,opt,vx,vy,vn;
rd(n),rd(m);
for(int i=1;i<=n;i++) rd(a[i]);
make(1,1,n);
while(m--){
rd(opt),rd(vx),rd(vy);
if(opt==1){
rd(vn);
cover(1,vx,vy,vn);
}
else if(opt==2){
rd(vn);
add(1,vx,vy,vn);
}
else if(opt==3){
wr(query(1,vx,vy)),ed;
}
}
}
/*
6 6
1 1 4 5 1 4
2 1 6 1
3 1 6
*/
5个TLE,4个AC,1个RE 时间复杂度应该是对的啊