AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 50000
int sum[4*MAX];
void PushUp( int rt ){
sum[rt] = sum[rt*2] + sum[rt*2+1];
}
void built( int l, int r, int rt ){
if( l == r ){
scanf( "%d", &sum[rt] );
return;
}
int mid = ( l + r ) >> 1;
built( l, mid, rt * 2 );
built( mid + 1, r, rt * 2 + 1 );
PushUp( rt );
}
void Add( int id, int num, int L, int R, int rt ){
if( L == R ){
sum[rt] += num;
return;
}
int mid = ( L + R ) >> 1;
if( id <= mid ) Add( id, num, L, mid, rt * 2 );
else Add( id, num, mid + 1, R, rt * 2 + 1 );
PushUp( rt );
}
void Sub( int id, int num, int L, int R, int rt ){
if( L == R ){
sum[rt] -= num;
return;
}
int mid = ( L + R ) >> 1;
if( id <= mid ) Sub( id, num, L, mid, rt * 2 );
else Sub( id, num, mid + 1, R, rt * 2 + 1 );
PushUp( rt );
}
int query( int l, int r, int L, int R, int rt ){
if( l <= L && r >= R ){
return sum[rt];
}
int mid = ( L + R ) >> 1;
int ans = 0;
if( l <= mid ) ans += query( l, r, L, mid, rt * 2 );
if( r > mid ) ans += query( l, r, mid + 1, R, rt * 2 + 1 );
return ans;
}
int main(){
int T, N, Case = 1;
scanf( "%d", &T );
while( T-- ){
scanf( "%d", &N );
built( 1, N, 1 );
printf( "Case %d:\n", Case++ );
char s[20];
int temp1, temp2;
while( scanf( "%s", s ) && strcmp( s, "End" ) ){
scanf( "%d%d", &temp1, &temp2 );
if( strcmp( "Query", s ) == 0 ){
printf( "%d\n", query( temp1, temp2, 1, N, 1 ) );
}else if( strcmp( "Add", s ) == 0 ){
Add( temp1, temp2, 1, N, 1 );
}else{
Sub( temp1, temp2, 1, N, 1 );
}
}
}
return 0;
}