https://blog.csdn.net/Yaokai_AssultMaster/article/details/79492190
#include <cstring>
#include <cstdio>
///用于区间求和
int data[200002];
int C[200002];
int lb(int x)///lowbit 用来求二进制的末尾0的个数 求的是二进制最后一个1 的位置
{
return x&-x;
}
int sum(int k)///求前n项和:
{
int value = C[k];
while (k > lb(k))
{
k-=lb(k);
value += C[k];
}
return value;
}
void add(int k, int d, int n)///对某个元素进行加法操作
///元素总个数n ,第k个元素增加d
{
C[k] += d; ///对树的更新
while (k+lb(k) <= n)
C[(k+=lb(k))] += d;
}
int range_sum (int i,int j)///区间求和
{
return sum(j)-sum(i);
}
int main()
{
int cases = 0, n, x, y;//元素总个数n
char buf[10];
while (~scanf("%d",&n) && n)
{
memset(C, 0, sizeof(C));
for (int i = 1; i <= n; ++ i)
{
scanf("%d",&data[i]);
add(i, data[i], n);
}
if (cases ++) puts("");
printf("Case %d:\n",cases);
while (~scanf("%s",buf) && strcmp(buf, "END"))
{
scanf("%d%d",&x,&y);
if (buf[0] == 'S')
{
add(x, y-data[x], n);
data[x] = y;
}
else
{
printf("%d\n",sum(y)-sum(x-1));
}
}
}
return 0;
}