简单的线段树入门题。
AC_code:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int l,r,sum;
int mid(){
return (l + r) >> 1;
}
}tree[50000 << 2];
int ans;
void buildtree(int l, int r, int rt){
tree[rt].l = l;
tree[rt].r = r;
if(l == r){
scanf("%d",&tree[rt].sum);
return;///一段递归结束
}
int mid = tree[rt].mid();
buildtree(l, mid, rt << 1);
buildtree(mid + 1, r, rt << 1 | 1);
tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
}
void update(int rt, int i, int j){
if(tree[rt].l == i && tree[rt].r == i){
tree[rt].sum += j;
return;
}
int mid = tree[rt].mid();
if(i <= mid) update(rt << 1, i, j);
else update(rt << 1 | 1, i, j);
tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
}
void query(int l, int r, int rt){
if(tree[rt].l >= l && tree[rt].r <= r){
ans += tree[rt].sum;
return;
}
int mid = tree[rt].mid();
if(r <= mid) query(l, r, rt << 1);
else if(l > mid) query(l, r, rt << 1 | 1);
else{
query(l, mid, rt << 1), query(mid + 1, r, rt << 1 | 1);
}
}
int main(){
// freopen("in.txt", "r", stdin);
int cas, t = 1;
scanf("%d",&cas);
while(cas--){
int N;
scanf("%d",&N);
buildtree(1, N, 1);
printf("Case %d:\n", t++);
char str[11];
while(scanf("%s",str)){
if(str[0]=='E')
break;
int a,b;
scanf("%d%d",&a,&b);
if(str[0]=='Q')
{
ans=0;
query(a,b,1);
printf("%d\n",ans);
}
else if(str[0]=='A')
update(1,a,b);
else
update(1,a,-b);
}
}
return 0;
}