线段树写的,样例过了,WA 10
#include <bits/stdc++.h>
#define int long long
struct TreeNode {
int sum, min, lzy;
size_t l, r;
TreeNode *lson, *rson;
TreeNode() {
sum = 0, min = 2e9, lzy = 0;
l = r = -1;
lson = rson = nullptr;
}
TreeNode(size_t _l, size_t _r) {
sum = 0, min = 2e9, lzy = 0;
l = _l, r = _r;
lson = rson = nullptr;
}
};
bool inRange(TreeNode *u, size_t L, size_t R) {
return u->l >= L && u->r <= R;
}
bool outRange(TreeNode *u, size_t L, size_t R) {
return u->l > R || u->r < L;
}
void pushup(TreeNode *u) {
u->sum = u->lson->sum + u->rson->sum;
u->min = std::min(u->lson->min, u->rson->min);
}
void maketag(TreeNode *u, int x) {
u->sum += (u->r - u->l + 1) * x;
u->min = u->min == 2e9 ? x : u->min + x;
u->lzy = x;
}
void pushdown(TreeNode *u) {
size_t mid = u->l + u->r >> 1;
if (!u->lson) u->lson = new TreeNode(u->l, mid);
if (!u->rson) u->rson = new TreeNode(mid + 1, u->r);
if (u->lzy) maketag(u->lson, u->lzy), maketag(u->rson, u->lzy);
u->lzy = 0;
}
int query_sum(TreeNode *u, size_t L, size_t R) {
if (outRange(u, L, R)) return 0;
if (inRange(u, L, R)) return u->sum;
pushdown(u);
return query_sum(u->lson, L, R) + query_sum(u->rson, L, R);
}
int query_min(TreeNode *u, size_t L, size_t R) {
if (outRange(u, L, R)) return 2e9;
if (inRange(u, L, R)) return u->min;
pushdown(u);
return std::min(query_min(u->lson, L, R), query_min(u->rson, L, R));
}
void update(TreeNode *u, size_t L, size_t R, int x) {
if (outRange(u, L, R)) return ;
if (inRange(u, L, R)) {
maketag(u, x);
return ;
}
pushdown(u);
update(u->lson, L, R, x);
update(u->rson, L, R, x);
pushup(u);
}
signed main() {
int n, q; scanf("%lld%lld", &n, &q);
TreeNode *root = new TreeNode(1, n);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
update(root, i, i, x);
}
char op[5];
for (int l, r, x; q; --q) {
scanf("%s%lld%lld", op, &l, &r);
if (op[0] == 'M') printf("%lld\n", query_min(root, l, r));
else if (op[0] == 'S') printf("%lld\n", query_sum(root, l, r));
else scanf("%lld", &x), update(root, l, r, x);
}
}