记录
#include <iostream>
#define I long long
#define C constexpr
#define Inf 1e10
using namespace std;
C I N = 1e6 + 10;
I w[N << 2], Lzy[N << 2], Lzy2[N << 2], A[N];
bool f[N << 2];
#define pushup(x) w[x] = max(w[x << 1], w[x << 1 | 1]);
void build (int x, int L, int r) {
if (L == r) {
w[x] = A[L];
return;
}
int mid = L + r >> 1;
build(x << 1, L, mid), build(x << 1 | 1, mid + 1, r);
pushup(x);
}
void makeTag (int x, int Len, I k) {
Lzy2[x] = 0;
Lzy[x] = k;
w[x] = k;
f[x] = 1;
}
void makeTag2 (int x, int Len, I k) {
Lzy2[x] += k;
w[x] += k;
}
void pushdown (int x, int L, int r) {
if (f[x] == 1) {
w[x << 1] = w[x << 1 | 1] = Lzy[x] + Lzy2[x];
Lzy[x << 1] = Lzy[x << 1 | 1] = Lzy[x];
Lzy2[x << 1] = Lzy2[x << 1 | 1] = Lzy2[x];
f[x << 1] = f[x << 1 | 1] = 1;
} else {
w[x << 1] += Lzy2[x];
w[x << 1 | 1] += Lzy2[x];
Lzy2[x << 1] += Lzy2[x];
Lzy2[x << 1 | 1] += Lzy2[x];
}
f[x] = 0, Lzy[x] = 0, Lzy2[x] = 0;
}
I query (int x, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return w[x];
} else if (!(l > R || r < L)) {
int mid = l + r >> 1;
pushdown(x, l, r);
I Ans = -Inf;
if (mid >= L)
Ans = max(Ans, query(1, l, mid, L, R));
if (mid < R)
Ans = max(Ans, query(1, mid + 1, r, L, R));
return Ans;
} else {
return -Inf;
}
}
void update (int x, int l, int r, int L, int R, I k) {
if (L <= l && r <= R) {
makeTag(x, r - l + 1, k);
} else {
int mid = l + r >> 1;
pushdown(x, l, r);
if (mid >= L)
update(x << 1, l, mid, L, R, k);
if (mid < R)
update(x << 1 | 1, mid + 1, r, L, R, k);
pushup(x);
}
}
void update2 (int x, int l, int r, int L, int R, I k) {
if (L <= l && r <= R) {
makeTag2(x, r - l + 1, k);
} else {
int mid = l + r >> 1;
pushdown(x, l, r);
if (mid >= L)
update2(x << 1, l, mid, L, R, k);
if (mid < R)
update2(x << 1 | 1, mid + 1, r, L, R, k);
pushup(x);
}
}
signed main () {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i ++)
cin >> A[i];
build(1, 1, n);
while (q --) {
int op;
cin >> op;
if (op == 1) {
int L, r, k;
cin >> L >> r >> k;
update(1, 1, n, L, r, k);
} else if (op == 2) {
int L, r, k;
cin >> L >> r >> k;
update2(1, 1, n, L, r, k);
} else if (op == 3) {
int L, r;
cin >> L >> r;
cout << query(1, 1, n, L, r) << '\n';
}
}
return 0;
}