1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Case 1: 6 33 59
//考查知识点:树状数组 线段树,
#include<stdio.h>
#include<string.h>
#define maxn 50010
int a[maxn];
char s[10];
int lowbit(int x)
{
<span style="white-space:pre"> </span>//return x&-x;
<span style="white-space:pre"> </span>return x&(x^(x-1));
}
void insert(int x,int add)
{
<span style="white-space:pre"> </span>while(x<maxn)//上溯的时候所有经过的点
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>a[x]+=add;
<span style="white-space:pre"> </span>x+=lowbit(x);//从包含x的一个子集中,到达另一个子集中
<span style="white-space:pre"> </span>}
}
int sum(int n)
{
<span style="white-space:pre"> </span>int sum1=0;
<span style="white-space:pre"> </span>while(n>0)//包含的n个数 一定包含 最后面的a[n]从后往前,即向下追寻的所有路过的子集和都加上
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>sum1+=a[n];
<span style="white-space:pre"> </span>n-=lowbit(n);//从一个子集和中转移到另一个子集中
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return sum1;
}
int main()
{
<span style="white-space:pre"> </span>int t;
<span style="white-space:pre"> </span>int count=1;
<span style="white-space:pre"> </span>scanf("%d",&t);
<span style="white-space:pre"> </span>while(t--)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>int i,j,n,m;
<span style="white-space:pre"> </span>scanf("%d",&n);
<span style="white-space:pre"> </span>memset(a,0,sizeof(a));
<span style="white-space:pre"> </span>for(i=1;i<=n;++i)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>scanf("%d",&m);
<span style="white-space:pre"> </span>insert(i,m);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>printf("Case %d:\n",count++);
<span style="white-space:pre"> </span>int pos,num;
<span style="white-space:pre"> </span>getchar();
<span style="white-space:pre"> </span>while(1)//有可能有多次所以加一个while(1) 循环
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>//<span style="white-space:pre"> </span>gets(s);//此处不能使用gets 。汗
<span style="white-space:pre"> </span>scanf("%s",s);
<span style="white-space:pre"> </span>if(s[0]=='A')
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>scanf("%d%d",&pos,&num);
<span style="white-space:pre"> </span>insert(pos,num);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(s[0]=='S')
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>scanf("%d%d",&pos,&num);
<span style="white-space:pre"> </span>insert(pos,-num);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(s[0]=='Q')
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>scanf("%d%d",&pos,&num);
<span style="white-space:pre"> </span>printf("%d\n",sum(num)-sum(pos-1));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>if(s[0]=='E')
<span style="white-space:pre"> </span>break;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return 0;
} 原文:http://blog.csdn.net/ice_alone/article/details/44784853