这份代码:
/*
I hope JLQ can bless me to AC the problem.
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int kMaxN = 1e5 + 5;
struct Node {
Node *ls, *rs;
int l, r;
ll sum, tag;
Node () {}
Node (int _l, int _r, ll _sum) : l(_l), r(_r), sum(_sum) {}
~Node() {}
} *rt ;
int n, m;
int a[kMaxN];
int op, x, y, k;
void pushup(Node* &cur) {
ll res = 0;
if (cur->ls != nullptr) res += cur->ls->sum;
if (cur->rs != nullptr) res += cur->rs->sum;
cur->sum = res;
}
void addTag(Node* &cur, ll v) {
cur->sum += 1ll * (cur->r - cur->l + 1) * v;
cur->tag += v;
}
void pushdown(Node* &cur) {
if (!cur->tag) return ;
addTag(cur->ls, cur->tag), addTag(cur->rs, cur->tag);
cur->tag = 0;
return ;
}
void build(Node* &cur, int l, int r) {
cur->l = l, cur->r = r;
if (l == r) {
cur->sum = a[l];
return ;
}
int mid = (l + r >> 1);
if (cur->ls == nullptr) cur->ls = new Node;
if (cur->rs == nullptr) cur->rs = new Node;
build(cur->ls, l, mid), build(cur->rs, mid + 1, r);
pushup(cur);
}
void update(Node* &cur, int ql, int qr, ll v) {
if (cur == nullptr) return ;
if (cur->l > qr || cur->r < ql) return ;
if (cur->l >= ql && cur->r <= qr) return addTag(cur, v), void();
// puts("no");
pushdown(cur);
update(cur->ls, ql, qr, v), update(cur->rs, ql, qr, v);
pushup(cur);
}
ll query(Node* cur, int ql, int qr) {
// puts("no");
if (cur == nullptr) return 0;
// puts("fuck");
if (cur->l > qr || cur->r < ql) return 0;
if (cur->l >= ql && cur->r <= qr) return cur->sum;
pushdown(cur);
return query(cur->ls, ql, qr) + query(cur->rs, ql, qr);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
// puts("never");
rt = new Node;
build(rt, 1, n);
// puts("bitch");
for (int i = 1; i <= m; ++i) {
// puts("gonna");
scanf("%d%d%d", &op, &x, &y);
// puts("shit");
if (op == 1) {
scanf("%d", &k);
update(rt, x, y, k);
}
else {
// puts("!!!");
printf("%lld\n", query(rt, x, y));
}
}
return 0;
}
本地输入到 2 2 4 就会 RE,交上去能过,而且空间很正常,求助大佬!