线段树 单点更新

题目链接

 http://acm.hdu.edu.cn/showproblem.php?pid=1166


//线段树 单点更新


#include <cstdio>
#include <algorithm>


using namespace std;
#define N 50010


int segtree[N*4+10];
int in[N];


void build_tree(int root, int l, int r){


   if (l==r){
    segtree[root] = in[l];
   }else{
   int mid = (l+r)>>1;
   build_tree(root*2,l,mid);
   build_tree(root*2+1,mid+1,r);
   segtree[root] = segtree[root*2] + segtree[root*2+1];
   }


}
int query_tree(int root , int l , int r, int ll, int rr){


 //   printf("l=%d r=%d %d\n",l,r,segtree[root]);
   if (l>rr || r< ll)
    return -1;
   if (l>=ll&&r<=rr){
    return segtree[root];
   }
   int mid = (l+r)>>1;
    int p1 =query_tree(root*2,l,mid,ll,rr);
   int p2= query_tree(root*2+1,mid+1,r,ll,rr);
   if (p1==-1)
    return p2;
   if (p2==-1)
    return p1;
   return p1+p2;


}
int update_tree(int root,int l ,int r , int pos , int v){


    if (pos<l || pos> r)
        return 1;
    if (l==r){
        segtree[root]+=v;
    }else{
        int mid = (l+r)>>1;
        if (pos<=mid)
        update_tree(root*2,l,mid,pos,v);
        else
            update_tree(root*2+1,mid+1,r,pos,v);
        segtree[root] = segtree[root*2]+segtree[root*2+1];


    }
}


int main (){


   int n;
    int t ;
    scanf("%d",&t);
    for (int i = 1 ; i <= t ; i++){
            printf("Case %d:\n",i);
        scanf("%d",&n);
        for (int j = 1 ; j <= n ; j++){
            scanf("%d",&in[j]);
        }
        build_tree(1,1,n);
        char s[10];
        int a,b;
        for (;;){
            scanf("%s",s);
            if (s[0]=='Q'){
                    scanf("%d%d",&a,&b);
               printf("%d\n",query_tree(1,1,n,a,b));
            }else if(s[0] == 'A'){
                 scanf("%d%d",&a,&b);
               update_tree(1,1,n,a,b);
            }else if (s[0] == 'S'){
                 scanf("%d%d",&a,&b);
               update_tree(1,1,n,a,-b);
            }else{
            break;
            }
        }


    }
   return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值