看起来是要模拟,但是如果用朴素数据结构(随机存取数组)的话肯定会超时,所以选择了树状数组
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std ;
const int maxn = 50000+1;
int ncase , tree[maxn] , n ;
void init() { memset( tree , 0 , sizeof( tree ) ) ; return ; }
int lowbit( int t ) { return t&(-t) ; }
void insert( int k , int d , int n ) {
while( k <= n ) { tree[k] += d ; k += lowbit( k ) ; } return ;
}
int getsum( int k ) {
int ans = 0 ; while( k > 0 ) { ans += tree[k] ; k -= lowbit( k ) ;
} return ans ; } void input() { scanf( "%d" , &n ) ; for( int i = 1 ; i <= n ; ++i ) { int tmp ; scanf( "%d" , &tmp ) ; insert( i , tmp , n ) ; } } void solve() { char op[10] ; int a , b ; while( scanf( "%s" , op ) == 1 && strcmp( op , "End" ) ) { scanf( "%d%d" , &a , &b ) ; if( strcmp( op , "Query" ) == 0 ) { if( a > b ) { int t = a ; a = b ; b = t ; } int t1 = getsum( a-1 ) ; int t2 = getsum( b ) ; printf( "%d/n" , t2-t1 ) ; } if( strcmp( op , "Add" ) == 0 ) { insert( a , b , n ) ; } if( strcmp( op , "Sub" ) == 0 ) { insert( a , -b , n ) ; } } return ; } void output() { return ; } int main() { int icase = 1 ; scanf( "%d" , &ncase ) ; while( ncase-- ) { printf( "Case %d:/n" , icase++ ) ; init() ; input() ; solve() ; output() ; } return 0 ; }