http://acm.hdu.edu.cn/showproblem.php?pid=1166
树状数组解:http://blog.csdn.net/u011742541/article/details/13227925
#include "stdio.h"
#include "string.h"
const int maxn = 50005;
int a[maxn],tree[maxn*4];
int n;
void Pushup( int t )
{
tree[t] = tree[t*2] + tree[t*2+1];
}
void buildtree( int ld,int rd,int t )
{
if( ld == rd )
{
tree[t] = a[ld];
return;
}
int mid = ( ld+rd )/2;
buildtree( ld,mid,t*2 );
buildtree( mid+1,rd,t*2+1);
Pushup(t);
}
void updata( int ld,int rd,int t,int x,int ad )
{
if( ld == rd )
{
tree[t]+=ad;
return;
}
int mid = ( ld+rd )/2;
if( mid < x )
updata( mid+1,rd,t*2+1,x,ad );
else
updata( ld,mid,t*2,x,ad );
Pushup(t);
}
int query( int ld,int rd,int t,int x,int y )
{
if( x <= ld && y >= rd )
{
return tree[t];
}
int mid = ( ld+rd )/2;
if( mid < x )
return query(mid+1,rd,t*2+1,x,y);
else if( mid>=y )
return query(ld,mid,t*2,x,y);
else
return query(mid+1,rd,t*2+1,x,y)+query(ld,mid,t*2,x,y);
}
int main()
{
int t,i,j,cas = 1;
scanf("%d",&t);
while( t-- )
{
scanf("%d",&n);
for( i = 1; i <= n; i ++ )
{
scanf("%d",&a[i]);
}
memset( tree,0,sizeof(tree) );
buildtree(1,n,1);
char str[8];
int x,y;
getchar();
printf("Case %d:\n",cas++);
while(1)
{
scanf("%s",str);
if( str[0]=='Q' )
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,n,1,x,y) );
}
else if( str[0] == 'E' )
{
break;
}
else
{
scanf("%d%d",&x,&y);
if( str[0] == 'S' )
y*=-1;
updata( 1,n,1,x,y );
}
}
}
return 0;
}