线段树 单点更新

来源:互联网 发布:mac子弹头色号 编辑:程序博客网 时间:2024/05/26 08:42

题目链接

 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