残阳如血 @ 2024-05-04 11:37:33
#include <iostream>
typedef long long lint;
const int N = 1e6 + 10;
const lint INF = -1e18;
int n, q, a[N];
lint w[4 * N], lzy_set[4 * N], lzy_add[4 * N];
bool inRange(int l, int r, int L, int R) {
return l >= L && r <= R;
}
bool outRange(int l, int r, int L, int R) {
return l > R || r < L;
}
void maketag(int u, int x, int type) { // 1:设置 0:加上
if (type) lzy_add[u] = 0, lzy_set[u] = w[u] = x;
else {
if (lzy_set[u] == INF) lzy_add[u] += x;
else lzy_set[u] += x;
w[u] += x;
}
}
void pushup(int u) {
w[u] = std::max(w[u * 2], w[u * 2 + 1]);
}
void pushdown(int u) {
if (lzy_set[u] == INF) { // 加上
maketag(u * 2, lzy_add[u], 0);
maketag(u * 2 + 1, lzy_add[u], 0);
lzy_add[u] = 0;
} else { // 设置
maketag(u * 2, lzy_set[u], 1);
maketag(u * 2 + 1, lzy_set[u], 1);
lzy_set[u] = INF;
}
}
void build(int u, int l, int r) {
lzy_set[u] = INF; // 赋值为一个不可能出现的数值
if (l == r) {
w[u] = a[l];
return ;
}
int mid = l + r >> 1;
build(u * 2, l, mid);
build(u * 2 + 1, mid + 1, r);
pushup(u);
}
lint query(int u, int l, int r, int L, int R) { // 查询
if (outRange(l, r, L, R)) return INF;
if (inRange(l, r, L, R)) return w[u];
int mid = l + r >> 1;
pushdown(u);
return std::max(query(u * 2, l, mid, L, R), query(u * 2 + 1, mid + 1 , r, L, R));
}
void update(int u, int l, int r, int L, int R, int x, int type) { // 更新
if (outRange(l, r, L, R)) return ;
if (inRange(l, r, L, R)) { maketag(u, x, type); return ; }
int mid = l + r >> 1;
pushdown(u);
update(u * 2, l, mid, L, R, x, type);
update(u * 2 + 1, mid + 1, r, L, R, x, type);
pushup(u);
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
std::cin >> n >> q;
for (int i = 1; i <= n; ++i) std::cin >> a[i];
build(1, 1, n);
for (int op, l, r, x; q; --q) {
std::cin >> op >> l >> r;
if (op == 1) std::cin >> x, update(1, 1, n, l, r, x, 1);
else if (op == 2) std::cin >> x, update(1, 1, n, l, r, x, 0);
else std::cout << query(1, 1, n, l, r) << '\n';
}
std::cout.flush();
return 0;
}
by 残阳如血 @ 2024-05-04 11:44:42
没开 long long 寄了