原題鏈接: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;
}