#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 10000005, SZ = N, INF = 0x7fffffff;
int n, q;
int a[1000005];
struct Node
{
int l, r;
int maxn;
int set_lazy = INF;
int add_lazy = 0;
} tree[SZ];
void pushdown(int u)
{
if (tree[u].set_lazy != INF)
{
tree[u * 2].maxn = tree[u].set_lazy;
tree[u * 2].set_lazy = tree[u].set_lazy;
tree[u * 2].add_lazy = 0;
tree[u * 2 + 1].maxn = tree[u].set_lazy;
tree[u * 2 + 1].set_lazy = tree[u].set_lazy;
tree[u * 2 + 1].add_lazy = 0;
tree[u].set_lazy = INF;
}
if (tree[u].add_lazy != 0)
{
tree[u * 2].maxn += tree[u].add_lazy;
tree[u * 2].add_lazy += tree[u].add_lazy;
tree[u * 2 + 1].maxn += tree[u].add_lazy;
tree[u * 2 + 1].add_lazy += tree[u].add_lazy;
tree[u].add_lazy = 0;
}
}
void build(int u = 1, int l = 1, int r = n)
{
tree[u].l = l;
tree[u].r = r;
if (l == r)
{
tree[u].maxn = a[l];
return;
}
int mid = (l + r) / 2;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}
void change(int L, int R, int x, int u = 1)
{
int l = tree[u].l, r = tree[u].r;
if (R < l || L > r)
return;
if (L <= l && r <= R)
{
tree[u].maxn = x;
tree[u].set_lazy = x;
tree[u].add_lazy = 0;
return;
}
pushdown(u);
change(L, R, x, u * 2);
change(L, R, x, u * 2 + 1);
tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}
void add(int L, int R, int x, int u = 1)
{
int l = tree[u].l, r = tree[u].r;
if (R < l || L > r)
return;
if (L <= l && r <= R)
{
tree[u].maxn += x;
tree[u].add_lazy += x;
return;
}
pushdown(u);
add(L, R, x, u * 2);
add(L, R, x, u * 2 + 1);
tree[u].maxn = max(tree[u * 2].maxn, tree[u * 2 + 1].maxn);
}
int qmax(int L, int R, int u = 1)
{
int l = tree[u].l, r = tree[u].r;
if (R < l || L > r)
return -INF;
if (L <= l && r <= R)
return tree[u].maxn;
pushdown(u);
return max(qmax(L, R, u * 2), qmax(L, R, u * 2 + 1));
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
build();
while (q--)
{
int op, l, r, x;
cin >> op;
if (op == 1)
{
cin >> l >> r >> x;
change(l, r, x);
}
else if (op == 2)
{
cin >> l >> r >> x;
add(l, r, x);
}
else if (op == 3)
{
cin >> l >> r;
cout << qmax(l, r) << '\n';
}
}
return 0;
}
50 pts