rt, 最后两个点T,其他点WA
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid ((l + r) >> 1)
const int N = 5e5 + 5;
const int inf = 1e9;
int n, m;
ll las;
struct nodeA {
int len;
ll sum, maxx, minn, laz1, laz2;
ll val;
} A[N << 2];
void pushup(int u) {
A[u].sum = A[ls].sum + A[rs].sum;
A[u].maxx = max(A[ls].maxx, A[rs].maxx);
A[u].val = max(A[u].val, A[u].maxx);
A[u].minn = min(A[ls].minn, A[rs].minn);
// A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
}
void pushdown(int u) {
if (A[u].laz2 != inf) {
ll g = A[u].laz2;
// if (A[ls].laz1) {
// A[ls].val = max(A[ls].val, A[ls].maxx + A[ls].laz1);
// }
// if (A[rs].laz1) {
// A[rs].val = max(A[rs].val, A[rs].maxx + A[rs].laz1);
// }
A[ls].laz1 = A[rs].laz1 = 0;
A[ls].sum = A[ls].len * g;
A[rs].sum = A[rs].len * g;
A[ls].laz2 = g, A[rs].laz2 = g;
A[ls].minn = A[ls].maxx = g;
A[rs].minn = A[rs].maxx = g;
A[u].laz2 = inf;
A[ls].val = max(A[ls].val, A[ls].maxx);
A[rs].val = max(A[rs].val, A[rs].maxx);
A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
}
if (A[u].laz1) {
ll g = A[u].laz1;
A[ls].sum += A[ls].len * g;
A[rs].sum += A[rs].len * g;
A[ls].laz1 += g, A[rs].laz1 += g;
A[ls].maxx += g, A[rs].maxx += g;
A[ls].minn += g, A[rs].minn += g;
A[u].laz1 = 0;
A[ls].val = max(A[ls].val, A[ls].maxx);
A[rs].val = max(A[rs].val, A[rs].maxx);
A[u].val = max(A[u].val, max(A[ls].val, A[rs].val));
}
}
void build(int u, int l, int r) {
A[u].len = r - l + 1;
A[u].laz1 = 0;
A[u].laz2 = inf;
if (l == r) {
cin >> A[u].sum;
A[u].val = A[u].maxx = A[u].minn = A[u].sum;
return ;
}
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(u);
}
void add(int u, int l, int r, int lr, int rr, ll c) {
if (lr <= l && r <= rr) {
A[u].sum += A[u].len * c;
A[u].maxx += c;
A[u].minn += c;
A[u].laz1 += c;
A[u].val = max(A[u].val, A[u].maxx);
return ;
}
pushdown(u);
if (lr <= mid) {
add(ls, l, mid, lr, rr, c);
}
if (rr > mid) {
add(rs, mid + 1, r, lr, rr, c);
}
pushup(u);
}
void modify(int u, int l, int r, int lr, int rr, ll c) {
if (l > r) return ;
if (A[u].maxx <= c) return ;
if (lr <= l && r <= rr && A[u].minn >= c) { // 这个区间的最小值大于c
A[u].laz2 = c;
// A[u].val = max(A[u].val, A[u].maxx + A[u].laz1);
A[u].laz1 = 0;
A[u].sum = A[u].len * c;
A[u].minn = A[u].maxx = c;
return ;
}
pushdown(u);
if (lr <= mid) {
modify(ls, l, mid, lr, rr, c);
}
if (rr > mid) {
modify(rs, mid + 1, r, lr, rr, c);
}
pushup(u);
}
ll query_sum(int u, int l, int r, int lr, int rr) {
if (lr <= l && r <= rr) {
return A[u].sum;
}
ll ans = 0;
pushdown(u);
if (lr <= mid) ans += query_sum(ls, l, mid, lr, rr);
if (rr > mid) ans += query_sum(rs, mid + 1, r, lr, rr);
pushup(u);
return ans;
}
ll query_max(int u, int l, int r, int lr, int rr) {
if (lr <= l && r <= rr) {
return A[u].maxx;
}
pushdown(u);
ll ans = -inf;
if (lr <= mid) ans = max(ans, query_max(ls, l, mid, lr, rr));
if (rr > mid) ans = max(ans, query_max(rs, mid + 1, r, lr, rr));
pushup(u);
return ans;
}
ll query_max_old(int u, int l, int r, int lr, int rr) {
if (lr <= l && r <= rr) {
return A[u].val;
}
pushdown(u);
ll ans = -inf;
if (lr <= mid) ans = max(ans, query_max_old(ls, l, mid, lr, rr));
if (rr > mid) ans = max(ans, query_max_old(rs, mid + 1, r, lr, rr));
pushup(u);
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
build(1, 1, n);
for (int i = 1, op, l, r; i <= m; ++ i) {
ll k;
cin >> op >> l >> r;
if (op == 1 || op == 2) {
cin >> k;
if (op == 1) {
add(1, 1, n, l, r, k);
}
else {
modify(1, 1, n, l, r, k);
}
}
else {
if (op == 3) {
cout << query_sum(1, 1, n, l, r) << '\n';
}
if (op == 4) {
cout << query_max(1, 1, n, l, r) << '\n';
}
if (op == 5) {
cout << query_max_old(1, 1, n, l, r) << '\n';
}
}
}
return 0;
}