NYOJ116士兵杀敌(二)

来源:互联网 发布:大数据专业大学排名 编辑:程序博客网 时间:2024/05/16 22:22

详细思路: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);}elseprintf("%d\n",S(y)-S(x-1));}}



0 0
原创粉丝点击