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


    /* 带点更新(累加),求部分线段和 */
    /*(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 ;
    }
  • 相关阅读:
    合并二叉树
    剑指 Offer 68
    剑指 Offer 42. 连续子数组的最大和
    C语言 递归实现迷宫寻路问题
    C语言数据结构 统计英文文字每个“单词”出现次数
    C语言 双链表的频度排序管理
    C语言 插入排序使链表递增
    c语言 简单的天数计算器
    数据结构 链表的头插法逆置
    C语言 删除指定的单词
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7702747.html
Copyright © 2020-2023  润新知