传送门:HDU1166
第一次接触到的树状数组的题目。没什么弯子,直接是模版使用。。
#include <cstdio>
#include <cstring>
#define N 50020
int ar[N]; // index: 1 ~ N
int n;
int lowb(int t) {
return t & (-t);
}
// 自动更新 第i个节点 和 之后相关的节点
void add(int i, int v) {
for ( ; i <= n ; ar[i] += v, i += lowb(i));
}
// 求 1 - i 的和
int sum(int i) {
int s = 0;
for ( ; i > 0; s += ar[i], i -= lowb(i));
return s;
}
void test() {
freopen("C:/Users/huhong/Desktop/MyAcmLife/in.txt", "r", stdin);
// freopen("C:/Users/huhong/Desktop/MyAcmLife/out.txt", "w", stdout);
}
int main(){
test();
int m,a,b,cas,cnt=1;
scanf("%d", &cas);
while(cas--) {
memset(ar, 0,sizeof(ar));
printf("Case %d:\n",cnt++);
scanf("%d",&n);
for(int i=1; i<=n; i++){
scanf("%d", &a);
add(i, a);
}
char s[10];
while(scanf("%s",s) && s[0] != 'E') {
int aa,bb;
scanf("%d%d",&aa,&bb);
if(s[0] == 'Q') {
printf("%d\n",sum(bb) - sum(aa-1));
} else if(s[0] == 'A') {
add(aa, bb);
} else {
add(aa, -bb);
}
}
}
return 0;
}