洛谷 [USACO15DEC] Counting Haybale P | P3130 WA 10 求助qwq

线段树写的,样例过了,WA 10 :sob: :sob: :sob:

#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);
  }
}

已解决。

懒标记应该是累加而不是覆盖