站外题。区间 [1,n]。
code :
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100005];
int lazy[100005];
int sum[100005];
void build(int l, int r, int x) {//建树
if (l == r) {
sum[x] = a[l];
return ;
}int m = (l + r) / 2;
build(l, m, x * 2);
build(m + 1, r, x * 2 + 1);
sum[x] = sum[x * 2] + sum[x * 2 + 1];
}void pushdown(int x, int l, int r) {//下传懒惰标记
int m = (l + r) / 2;
if (lazy[x]) {
lazy[x * 2] = lazy[x];sum[x * 2] += (m - l + 1) * lazy[x];
lazy[x * 2 + 1] = lazy[x];sum[x * 2 + 1] += (r - m) * lazy[x];
lazy[x] = 0;
}
}void modify(int L, int R, int value, int l, int r, int x) {//增加操作
if (L <= l && r <= R) {
sum[x] += (r - l + 1) * value;
lazy[x] += value;
return;
}pushdown(x, l, r);
int m = (l + r) / 2;
if (L <= m) {
modify(L, R, value, l, m, x * 2);
}if (R > m) {
modify(L, R, value, m + 1, r, x * 2 + 1);
}sum[x] = sum[x * 2] + sum[x * 2 + 1];
}int query(int L, int R, int l, int r, int x) {//查询
if (L <= l && r <= R) {
return sum[x];
}pushdown(x, l, r);
int m = (l + r) / 2;
int ret = 0;
if (L <= m) {
ret += query(L, R, l, m, x * 2);
}if (R > m) {
ret += query(L, R, m + 1, r, x * 2 + 1);
}return ret;
}signed main() {
int n;scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}build(1, n, 1);
int m;scanf("%lld", &m);
for (int i = 1; i <= m; i++) {
getchar();
char s = getchar();
if (s == 'Q') {//查询
int x, y, l;
scanf("%lld%lld", &x, &y);
printf("%lld\n", query(x, y, 1, n, 1));
}else {//更新[x,y]区间增加z
int x, y, z;
scanf("%lld%lld%lld", &x, &y, &z);
modify(x, y, z, 1, n, 1);
}
}return 0;
}
样例+本地数据未发现错误。
系统返回Runtime Error:Segmentation fault