#include<stdio.h>
#include<string.h>
int num[1000010],n;
void updata(int val,int i){
while(i<=n)
{
num[i]+=val;
i+=i&(-i);
}
}//更新线段树
int sum(int i)
{
int s=0;
while(i>0)
{
s+=num[i];
i-=i&(-i);
}
return s;
}//计算值
int main()
{
int m,i,j,k,x,y;
char str[15];
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
updata(k,i);
}
for(i=0;i<m;i++)
{
scanf("%s",str);
if(str[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",sum(y)-sum(x-1));
}
else
{
scanf("%d%d",&x,&y);
updata(y,x);
}
}
return 0;
}
补充:
i&(-i)等于多少?
#include<iostream>
using namespace std;
int main()
{
int i;
for(i=1; i<=10; i++)
cout<<(i&(-i))<<endl;
return 0;
}
返回 i 的二进制数最低位为1的权值
例如
10100最低位的1权值是4
1001010最低位的1权值是2
111最低位的1权值是1
因此结果就是
1 2 1 4 1 2 1 8 1 2
南阳 116 士兵杀敌(二)
最新推荐文章于 2017-08-11 19:41:38 发布