/* (線段樹)帶點更新(累加),求部分線段和 */

/* 帶點更新(累加),求部分線段和 */
/*(1) Add i j,i和j爲正整數,表示第i個營地增長j我的(j不超過30)
(2)Sub i j ,i和j爲正整數,表示第i個營地減小j我的(j不超過30);
(3)Query i j ,i和j爲正整數,i<=j,表示詢問第i到第j個營地的總人數;
(4)End 表示結束,這條命令在每組數據最後出現;*/
#include<cstdio>
#include<cstring>
#define maxn 50010

typedef struct node{
    int sum ;
    int l , r  ;
}Lnode;

Lnode tree[maxn*4] ;
int ans ;
int num[maxn] ;

void bulid(int root , int ll , int rr){
    if(ll == rr){
        tree[root].l = tree[root].r = ll ;
        tree[root].sum = num[ll] ;
        return;
    }
    tree[root].l = ll ;
    tree[root].r = rr ;
    int mid = (ll+rr)/2 ;
    bulid(root*2 , ll , mid) ;
    bulid(root*2+1 , mid+1 , rr) ;
    tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ;
}

void update(int root , int pos , int value){
    if(tree[root].l == pos&&tree[root].r == pos){
        tree[root].sum+=value ;
        return;
    }
    int mid = (tree[root].l+tree[root].r)/2 ;
    if(pos <= mid)
        update(root*2 , pos , value) ;
    else update(root*2+1 , pos , value) ;
    
    tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ;
}

void query(int root , int s , int e){
    int mid = (tree[root].l + tree[root].r)/2 ;
    if(tree[root].l==s&&tree[root].r==e){
        ans += tree[root].sum ;
    }
    else if(s>mid)
        query(root*2+1 , s , e) ;
    else if(e<=mid)
        query(root*2 , s , e ) ;
    else if(s<=mid&&mid<=e){ // 此處 if可去掉
        query(root*2 , s , mid) ;
        query(root*2+1 , mid+1 , e) ;
    }
}
int main(){
    int t , cas=0 ;
    int n,x,y ;
    char str[10] ;
    scanf("%d" , &t) ;
    while(t--){
        scanf("%d" , &n) ;
        for(int i=1 ; i<=n ; i++)
            scanf("%d" , &num[i]) ;
            
        bulid(1,1,n) ;
        printf("Case %d:\n" , ++cas) ;
        while(~scanf("%s" , str),str[0]!='E'){
            scanf("%d%d" , &x , &y) ;
            if(str[0] == 'Q'){
                ans = 0 ;
                query(1 , x , y ) ;
                printf("%d\n" , ans) ;
            }
            else if(str[0] == 'A'){
                update(1 , x, y) ;
            }
            else if(str[0] == 'S'){
                update(1 , x, -y) ;
            }
        }
    }
    return 0 ;
}
相關文章
相關標籤/搜索