nyoj116 士兵杀敌(二) (树状数组)

来源:互联网 发布:手机单机小游戏知乎 编辑:程序博客网 时间:2024/05/16 11:38

原题链接: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;}


0 0