#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ls (a[k].son[0])
#define rs (a[k].son[1])
const int N = 1000005;
struct{
int son[2];
LL sum;
LL add_tag, cha_tag;
bool used = 0;
}a[4*N];
int n, m;
int val[N], cnt, root;
void update(int k){
a[k].sum = max(a[ls].sum, a[rs].sum);
}
void cha(int k, int cha_val){
a[k].cha_tag = cha_val;
a[k].add_tag = 0;
a[k].sum = cha_val;
a[k].used = 1;
}
void add(int k, int add_val){
a[k].add_tag += add_val;
a[k].sum += add_val;
}
void push_down(int k){
if(a[k].add_tag){
add(ls, a[k].add_tag);
add(rs, a[k].add_tag);
}
if(a[k].used){
cha(ls, a[k].cha_tag);
a[ls].sum += a[ls].add_tag;
cha(rs, a[k].cha_tag);
a[rs].sum += a[rs].add_tag;
a[ls].add_tag = a[k].add_tag;
a[rs].add_tag = a[k].add_tag;
}
a[k].used = a[k].add_tag = a[k].cha_tag = 0;
}
void build(int &k, int l, int r){
k = ++cnt;
a[k].sum = -1e8;
if(l == r){
a[k].sum = val[l];
return;
}
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid+1, r);
update(k);
}
void modify1(int k, int l, int r, int ql, int qr, int cha_val){
if(ql <= l && qr >= r){
cha(k, cha_val);
return;
}
push_down(k);
int mid = (l + r) >> 1;
if(qr <= mid) modify1(ls, l, mid, ql, qr, cha_val);
if(ql > mid) modify1(rs, mid+1, r, ql, qr, cha_val);
update(k);
}
void modify2(int k, int l, int r, int ql, int qr, int add_val){
if(ql <= l && qr >= r){
add(k, add_val);
return;
}
push_down(k);
int mid = (l + r) >> 1;
if(qr <= mid) modify2(ls, l, mid, ql, qr, add_val);
if(ql > mid) modify2(rs, mid+1, r, ql, qr, add_val);
update(k);
}
LL query(int k, int l, int r, int ql, int qr){
if(ql <= l && qr >= r)
return a[k].sum;
push_down(k);
int mid = (l + r) >> 1;
if(qr <= mid) return query(ls, l, mid, ql, qr);
if(ql > mid) return query(rs, mid+1, r, ql, qr);
return max(query(ls, l, mid, ql, qr), query(rs, mid+1, r, ql, qr));
}
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++)
scanf("%d", &val[i]);
build(root, 1, n);
for(int i=1;i<=m;i++){
int op, x, y, v;
cin >> op;
if(op == 1){
scanf("%d%d%d", &x, &y, &v);
modify1(root, 1, n, x, y, v);
}
else if(op == 2){
scanf("%d%d%d", &x, &y, &v);
modify2(root, 1, n, x, y, v);
}
else {
scanf("%d%d", &x, &y);
printf("%lld\n", query(root, 1, n, x, y));
}
}
return 0;
}