/* (线段树)带点更新(累加),求部分线段和 */

/* 带点更新(累加),求部分线段和 */
/*(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:
" , ++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
" , ans) ;
            }
            else if(str[0] == 'A'){
                update(1 , x, y) ;
            }
            else if(str[0] == 'S'){
                update(1 , x, -y) ;
            }
        }
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7702747.html