求助 WA on #1
查看原帖
求助 WA on #1
507534
YBaggio楼主2023/7/10 21:58
#include <iostream>
typedef long long ll;
using namespace std;
const int maxn = 200010;
int n, m, tot, now, tim, root[maxn], p[maxn];
ll a[maxn];
struct E {
  int l, r;
  ll val, buff;
} t[maxn * 100];
void build (int &x, int l, int r) {
  x = ++tot;
  if (l == r) { t[x].val = a[l]; return; }
  int mid = l + r >> 1;
  build (t[x].l, l, mid);
  build (t[x].r, mid + 1, r);
  t[x].val = t[t[x].l].val + t[t[x].r].val;
}
void modify (int _x, int &x, int l, int r, int L, int R, ll v) {
  t[x = ++tot] = t[_x];
  t[x].val += v * (min (r, R) - max (l, L) + 1);
  if (L <= l && r <= R) {
    t[x].buff += v;
    // t[x].val += v * (r - l + 1);
    return ;
  }
  int mid = l + r >> 1;
  if (L <= mid) modify (t[_x].l, t[x].l, l, mid, L, R, v);
  if (R > mid) modify (t[_x].r, t[x].r, mid + 1, r, L, R, v);
  // t[x].val = t[t[x].l].val + t[t[x].r].val;
}
ll query (int x, int l, int r, int L, int R) {
  if (L <= l && r <= R) return t[x].val;
  ll tmp = 0;
  int mid = l + r >> 1;
  if (L <= mid) tmp += query (t[x].l, l, mid, L, R);
  if (mid < R) tmp += query (t[x].r, mid + 1, r, L, R);
  tmp += t[x].buff * (min (r, R) - max (l, L) + 1);
  return tmp;
}
int main () {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  build (root[0], 1, n);
  for (int i = 1; i <= m; i++) {
    char op;
    int l, r, ti;
    ll x;
    cin >> op;
    if (op == 'C') {
      cin >> l >> r >> x;
      p[++now] = ++tim;
      modify (root[tim - 1], root[tim], 1, n, l, r, x);
      now++;
    } else if (op == 'Q') {
      cin >> l >> r;
      cout << query (root[tim], 1, n, l, r) << '\n';
    } else if (op == 'H') {
      cin >> l >> r >> ti;
      cout << query (root[p[ti]], 1, n, l, r) << '\n';
    } else {
      cin >> ti;
      now = ti;
      root[++tim] = root[p[ti]];
    }
  }
  return 0;
}
2023/7/10 21:58
加载中...