单点更新,求区间
#include <stdio.h>
#include <string.h>
#define LEN 50001
int a[LEN];
int c[LEN];
int lowbit(int x) {
return x & (-x);
}
void update(int pos, int val) {
while(pos <= LEN) {
c[pos] += val;
pos += lowbit(pos);
}
}
int query(int pos) {
int sum = 0;
while(pos > 0) {
sum += c[pos];
pos -= lowbit(pos);
}
return sum;
}
int main() {
int files, n;
int i, j;
scanf("%d", &files);
for(i = 1; i <= files; i++) {
char cmd[20];
memset(cmd, 0, sizeof(cmd));
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
scanf("%d", &n);
for(j = 1; j <= n; j++) {
scanf("%d", &a[j]);
update(j, a[j]);
}
printf("Case %d:\n", i);
while(scanf("%s", cmd), cmd[0] != 'E') {
int a, b, r;
scanf("%d%d", &a, &b);
switch(cmd[0]) {
case 'Q':
r = query(b) - query(a-1);
printf("%d\n", r);
break;
case 'A':
update(a, b);
break;
case 'S':
update(a, -b);
break;
default:
break;
}
}
}
}

1553

被折叠的 条评论
为什么被折叠?



