#include <stdio.h>
const int MAXN = 1e5 + 5;
int n, m, block, op, x, y, k, bx, by;
long long ret;
int belong[MAXN], beg[MAXN], end[MAXN];
long long a[MAXN], sum[MAXN], tag[MAXN];
int main(void) {
scanf("%d %d", &n, &m);
block = __builtin_sqrt(n);
for (int i = 1; i <= n; ++i) {
scanf("%lld", a + i);
if (i % block == 1) {
belong[i] = belong[i - 1] + 1;
beg[belong[i]] = i;
}
else
belong[i] = belong[i - 1];
sum[belong[i]] += a[i];
end[belong[i]] = i;
}
if (m) {
do {
scanf("%d %d %d", &op, &x, &y);
bx = belong[x];
by = belong[y];
if (op == 1) {
scanf("%d", &k);
if (bx == by) {
for (int i = x; i <= y; ++i)
a[i] += k;
}
else {
for (int i = bx + 1; i < by; ++i) {
sum[i] += 1ll * k * (end[i] - beg[i] + 1);
tag[i] += k;
}
for (int i = x; i <= end[bx]; ++i)
a[i] += k;
for (int i = y; i >= beg[by]; --i)
a[i] += k;
}
}
else {
ret = 0;
if (tag[bx]) {
sum[bx] += 1ll * k * (end[bx] - beg[bx] + 1);
for (int i = beg[bx]; i <= end[bx]; ++i)
a[i] += tag[bx];
tag[bx] = 0;
}
if (tag[by]) {
sum[by] += 1ll * k * (end[by] - beg[by] + 1);
for (int i = beg[by]; i <= end[by]; ++i)
a[i] += tag[by];
tag[by] = 0;
}
if (bx == by) {
for (int i = x; i <= y; ++i)
ret += a[i];
}
else {
for (int i = bx + 1; i < by; ++i)
ret += sum[i];
for (int i = x; i <= end[bx]; ++i)
ret += a[i];
for (int i = y; i >= beg[by]; --i)
ret += a[i];
}
printf("%lld\n", ret);
}
} while (--m);
}
return 0;
}
如标题所述,本萌新使用分块算法,全 WA。
请高人指点。