#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M = 1e6 + 5;
int n, m, a[M], t[M * 4], tag[M * 4];
int ls(int p) { return p << 1; }
int rs(int p) { return p << 1 | 1; }
inline void push_up(int p) { t[p] = max(t[ls(p)], t[rs(p)]); }
inline void change(int p, int l, int r, int k) { t[p] += k, tag[p] += k; }
inline void push_down(int p, int l, int r) {
if(tag[p]) {
int mid = (l + r) >> 1;
change(ls(p), l, mid, tag[p]), change(rs(p), mid + 1, r, tag[p]);
tag[p] = 0;
}
}
inline void build(int p, int l, int r) {
if(l == r) return (void)(t[p] = a[l]);
int mid = (l + r) >> 1;
build(ls(p), l, mid), build(rs(p), mid + 1, r);
push_up(p);
}
inline void update(int l, int r, int p, int pl, int pr, int k, int opt) {
if(l <= pl && pr <= r) return opt == 1 ? change(p, pl, pr, k - t[p]) : change(p, pl, pr, k);
push_down(p, pl, pr);
int mid = (pl + pr) >> 1;
if(l <= mid) update(l, r, ls(p), pl, mid, k, opt);
if(mid < r) update(l, r, rs(p), mid + 1, pr, k, opt);
push_up(p);
}
int qry(int l, int r, int p, int pl, int pr) {
if(l <= pl && pr <= r) return t[p];
push_down(p, pl, pr);
int mid = (pl + pr) >> 1, res = -1e18;
if(l <= mid) res = max(res, qry(l, r, ls(p), pl, mid));
if(mid < r) res = max(res, qry(l, r, rs(p), mid + 1, pr));
return res;
}
signed main() {
// freopen("in.txt", "r", stdin);
// freopen("mine.txt", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
int opt, l, r, x;
while(m--) {
cin >> opt >> l >> r;
if(opt <= 2) cin >> x, update(l, r, 1, 1, n, x, opt);
if(opt == 3) cout << qry(l, r, 1, 1, n) << "\n";
}
return 0;
}