http://acm.hdu.edu.cn/showproblem.php?pid=1166
线段树解:
http://blog.csdn.net/u011742541/article/details/13228813
#include "stdio.h"
#include "string.h"
const int maxn = 50005;
int n,c[maxn];
int lowbit( int x )
{
return x&(-x);
}
void add( int x,int ad )
{
while( x <= n )
{
c[x] += ad;
x += lowbit(x);
}
}
int sum( int x )
{
int ans = 0;
while( x >= 1 )
{
ans += c[x];
x -= lowbit(x);
}
return ans;
}
int main()
{
int t,i,j,cas = 1;
scanf("%d",&t);
while( t-- )
{
int id,ad,x,y;
char str[10];
memset( c,0,sizeof(c) );
scanf("%d",&n);
for( i = 1; i <= n; i ++ )
{
scanf("%d",&ad);
add( i,ad );
}
printf("Case %d:\n",cas++);
int q = 40000;
while( 1 )
{
scanf("%s",str);
if( str[0] == 'A' )
{
scanf("%d%d",&id,&ad);
add( id,ad );
}
else if( str[0] == 'S' )
{
scanf("%d%d",&id,&ad);
add( id,-ad );
}
else if( str[0] == 'Q' )
{
scanf("%d%d",&x,&y);
printf("%d\n", sum(y)-sum(x-1) );
}
else if( str[0] == 'E' )
{
break;
}
}
}
return 0;
}