详细思路:http://www.cnblogs.com/Howe-Young/p/4009223.html?ADUIN=1466989448&ADSESSION=1413411257&ADTAG=CLIENT.QQ.5359_.0&ADPUBNO=26397
#include <stdio.h>
const int maxn = 1000001;
int a[maxn],N;
int lowbit(int x)
{
//求最低位1表示的数字
return x&(-x);
}
/*
如:
x =1: 1 &-1(设位数为8)0000 0001 & 1111 1111 = 1
x = 6:6 & -6 0000 0110&1111 1010 = 2
其实就是:
求出2^p(其中p: x 的二进制表示数中, 右向左数第一个1的位置),
如6的二进制表示为110,向左数第零个为0,
第一个为1,则p=1,故Lowbit(6) = 2^1 = 2。*/
void update(int i,int num)
{
while(i<=N)
{
a[i]+=num;
i+=lowbit(i);
}
}
int S(int x)
{
int sum = 0;
while(x>0)
{
sum+=a[x];
x=x-lowbit(x);
}
return sum;
}
int main()
{
int x,y,ans,num,t;
char s[10];
scanf("%d%d",&N,&t);
for(int i = 1; i<=N; i++)
{
scanf("%d",&num);
update(i,num);
}
while(t--)
{
scanf("%s %d %d",s,&x,&y);
if(s[0] == 'A')
{
update(x,y);
}
else
printf("%d\n",S(y)-S(x-1));
}
}