#include <bits/stdc++.h>
#define int long long
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define dF(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
inline int rd() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(int x) {
if(x<0)x = ~x + 1, putchar('-');
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
inline int lowbit(int x) {
return x&(-x);
}
typedef long long ll;
typedef pair<int,int> Pair;
const int N=1000005,M=(N<<1),inf=1e18,mod=1e9+7;
int n,q,a[N];
struct SegmentTree{
int l,r,mx,add,tag;
}t[N<<2];
void upd(int p){
t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;t[p].tag=inf;
if(l==r){ t[p].mx=a[l];return; }
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
upd(p);
}
void spread(int p){
int q=t[p].tag;
if(q!=inf){
t[p*2].mx=t[p*2+1].mx=q;
t[p*2].add=t[p*2+1].add=0;
t[p*2].tag=t[p*2+1].tag=q;
t[p].tag=inf;t[p].add=0;
}
q=t[p].add;
if(q){
t[p*2].mx+=q;
t[p*2+1].mx+=q;
t[p*2].add+=q;
t[p*2+1].add+=q;
t[p].add=0;
}
}
void change2(int p,int l,int r,int v){
if(l<=t[p].l&&r>=t[p].r) {
t[p].mx=v;t[p].add=0;t[p].tag=v;
return;
}
spread(p);
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) change2(p*2,l,r,v);
if(r>mid) change2(p*2+1,l,r,v);
upd(p);
}
void change1(int p,int l,int r,int v){
if(l<=t[p].l&&r>=t[p].r) {
int q=t[p].tag;
if(q!=inf){
t[p*2].mx=t[p*2+1].mx=q;
t[p*2].add=t[p*2+1].add=0;
t[p*2].tag=t[p*2+1].tag=q;
t[p].tag=inf;t[p].add=0;
}
t[p].mx+=v;t[p].add+=v;
return;
}
spread(p);
int mid=(t[p].l+t[p].r)/2;
if(l<=mid) change1(p*2,l,r,v);
if(r>mid) change1(p*2+1,l,r,v);
upd(p);
}
int ask(int p,int l,int r){
if(l<=t[p].l&&r>=t[p].r)
return t[p].mx;
int rt=-inf,mid=(t[p].l+t[p].r)/2;
spread(p);
if(l<=mid) rt=max(rt,ask(p*2,l,r));
if(r>mid) rt=max(rt,ask(p*2+1,l,r));
return rt;
}
void solve(){
n=rd();q=rd();
F(i,1,n)a[i]=rd();
build(1,1,n);
while(q--){
int op=rd(),l=rd(),r=rd();
if(op==1) change2(1,l,r,rd());
else if(op==2) change1(1,l,r,rd());
else write(ask(1,l,r)),cout<<"\n";
}
}
signed main() {
solve();
return 0;
}