树状数组专题(二)-区间查询
算法思想:
单点更新,区间查询
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 30000+5;
int c[maxn];
int lowbit(int x){
return x & (-x);
}
void add(int x,int v){
for(int i = x ; i < maxn ; i += lowbit(i)){
c[i] += v;
}
}
int getSum(int x){
int sum = 0;
for(int i = x; i > 0 ; i -= lowbit(i)){
sum += c[i];
}
return sum;
}
int main(){
int T;
scanf("%d",&T);
for(int t = 1 ; t <= T ; t++){
memset(c,0,sizeof(c)); // 每次清零
int n;
scanf("%d",&n);
int x;
for(int i = 1 ; i <= n ; i++){
scanf("%d",&x);
add(i,x);
}
string q;
printf("Case %d:\n",t);
while(cin>>q && (q != "End")){
int a,b;
scanf("%d%d",&a,&b);
if(q[0] == 'Q')
printf("%d\n",getSum(b)-getSum(a-1)); // 注意这里
else if(q[0] == 'A')
add(a,b);
else if(q[0] == 'S')
add(a,-b);
}
}
return 0;
}