原题链接:nyoj116 士兵杀敌(二)
基本的树状数组的题,关于树状数组网上解析有很多,讲的也很详细,这里不做过多解释了,主要是下标按照位运算非常巧妙的储存
//树状数组:复杂度O(log n)
#include <cstdio>
using namespace std;
const int MAX_N = 1000000 + 10;
int N, M;
int bit[MAX_N]; //bit[i]表示第1项到第i项的和
void add(int i, int x){ //加
while(i <= N){
bit[i] += x;
i += i & -i;
}
}
int sum(int i){ //求和a[1]到a[i]之间的和
int s = 0;
while(i > 0){
s += bit[i];
i -= i & -i;
}
return s;
}
int main(){
int i, x;
char s[8];
scanf("%d%d", &N, &M);
for(i = 0;i < N;i ++){
scanf("%d", &x);
add(i + 1, x); //下表从1开始
}
int m, n;
for(i = 0;i < M;i ++) {
scanf("%s%d%d", s, &m, &n);
if(s[0] == 'Q')
printf("%d\n", sum(n) - sum(m - 1));
else
add(m, n);
}
return 0;
}