最基础的线段树,单点更新。完全跟着HH的代码风格写的。
code:
#include<cstdio> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 const int maxn = 50005 ; int sum[maxn<< 2] ; void PushUp( int rt){ sum[rt] = sum[rt<< 1] + sum[rt<< 1| 1] ; } void build( int l, int r, int rt){ if(l==r){ scanf( " %d ", &sum[rt]) ; return ; } int m = (l + r) >> 1 ; build(lson) ; build(rson) ; PushUp(rt) ; } void update( int p, int add, int l, int r, int rt){ if(l==r){ sum[rt] += add ; return ; } int m = (l + r) >> 1 ; if(p<=m) update(p, add, lson) ; else update(p, add, rson) ; PushUp(rt) ; } int query( int L, int R, int l, int r, int rt){ if(L<=l&&r<=R){ return sum[rt] ; } int m = (l + r) >> 1 ; int ret = 0 ; if(L<=m) ret += query(L, R, lson) ; if(R>m) ret += query(L, R, rson) ; return ret ; } int main(){ int t= 1, T, n, i, j, a, b ; char str[ 10] ; scanf( " %d ", &T) ; while(T--){ scanf( " %d ", &n) ; build( 1, n, 1) ; printf( " Case %d:\n ", t++) ; while( 1){ scanf( " %s ", str) ; if(str[ 0]== ' E ') break ; scanf( " %d%d ", &a, &b) ; if(str[ 0]== ' A ') update(a, b, 1, n, 1) ; else if(str[ 0]== ' S ') update(a, -b, 1, n, 1) ; else printf( " %d\n ", query(a, b, 1, n, 1)) ; } } return 0 ;}