题意很简单不介绍。
这题下午写烦了,最后调试发现妈蛋,update中有个地方应该是right - mid想当然地写成了right - mid + 1,浪费好久时间。。。
明天回家了,这应该是回家前的最后一题了~~~
( ^_^ )/~~拜拜
有一股清爽感在心间沸腾有木有!!!
#include <cstdio>
#include <algorithm>
using std::min;
using std::max;
typedef long long ll;
const int MAX = 100007;
struct node {
ll add;
ll sum;
} a[MAX << 2];
ll b[MAX];
inline int LS(const int& root) {
return root << 1;
}
inline int RS(const int& root) {
return root << 1 | 1;
}
void build(int root, int left, int right) {
a[root].add = 0;
if (left == right) {
a[root].sum = b[left];
//printf("a[%d].sum = %d\n", root, b[left]);
return;
}
int mid = (left + right) >> 1;
build(LS(root), left, mid);
build(RS(root), mid + 1, right);
a[root].sum = a[LS(root)].sum + a[RS(root)].sum;
}
void update(int root, int left, int right, int s, int e, ll c) {
if (s > right || e < left) {
return;
}
if (s <= left && e >= right) {
a[root].add += c;
} else {
int mid = (left + right) >> 1;
update(LS(root), left, mid, s, e, c);
update(RS(root), mid + 1, right, s, e, c);
a[root].sum = a[LS(root)].sum + a[LS(root)].add * (mid - left + 1)
+ a[RS(root)].sum + a[RS(root)].add * (right - mid);
}
}
void debug() {
for (int i = 1; i < 18; ++i) {
printf("%d: (%lld, %lld)\n", i, a[i].add, a[i].sum);
}
puts("");
}
ll query(int root, int left, int right, int s, int e) {
//printf("query(%d, %d, %d, %d, %d)\n", root, left, right, s, e);
if (s > right || e < left) {
return 0LL;
}
if (s <= left && e >= right) {
return a[root].sum + a[root].add * (right - left + 1);
} else {
int mid = (left + right) >> 1;
return query(LS(root), left, mid, s, e) + query(RS(root), mid + 1, right, s, e)
+ a[root].add * (min(right, e) - max(left, s) + 1);
}
}
void read(ll& x) {
char ch;
while ((ch = getchar()) < '0' || ch > '9');
}
int main() {
int N, Q;
while (~scanf(" %d %d", &N, &Q)) {
for (int i = 1; i <= N; ++i) {
scanf(" %lld", b + i);
}
build(1, 1, N);
char op;
int left, right;
ll cherry;
while (Q--) {
//debug();
scanf(" %c %d %d", &op, &left, &right);
if (op == 'Q') {
printf("%lld\n", query(1, 1, N, left, right));
} else {
scanf(" %lld", &cherry);
update(1, 1, N, left, right, cherry);
}
}
}
return 0;
}