点更新线段树问题

 

//4671028 2011-09-28 12:40:35 Accepted 1166 78MS 1720K 2395 B G++ nkhelloworld
//4671030 2011-09-28 12:41:04 Accepted 1166 46MS 1764K 2395 B C++ nkhelloworld
//点更新线段树
#include <cstdio>
#define MAXN 50000
struct SEGMENTTREE
{
    int left,right,sum;
}tree[MAXN*4];
int n;

void buildsegtree(int pos,int left,int right)
{
    tree[pos].left = left;  tree[pos].right = right;
    if(left==right)
    {
        scanf("%d",&tree[pos].sum);
        return ;
    }
    int mid = (left+right)>>1;
    buildsegtree(pos<<1,left,mid);
    buildsegtree(pos<<1|1,mid+1,right);
    tree[pos].sum = tree[pos<<1].sum + tree[pos<<1|1].sum;
}

void add(int root,int addpos,int num)
{
    if(tree[root].left == tree[root].right)
    {
        tree[root].sum += num;
        return ;
    }
    int mid = (tree[root].left + tree[root].right)>>1;
    if(addpos <=mid)
    {
        add(root<<1,addpos,num);
    }
    else
    {
        add(root<<1|1,addpos,num);
    }
    tree[root].sum = tree[root<<1].sum + tree[root<<1|1].sum;
}

int query(int root,int a,int b)
{
    int ans = 0;
    if(tree[root].left == a && tree[root].right == b)
    {
        ans += tree[root].sum;
        return ans;
    }
    int mid = (tree[root].left+tree[root].right)>>1;
    if(a > mid)
    {
        ans = query(root<<1|1,a,b);
    }
    else if(b <= mid)
        ans = query(root<<1,a,b);
    else
    {
        ans = query(root<<1,a,mid) + query(root<<1|1,mid+1,b);
    }
    return ans;
}

int main()
{
    int i,j,totcase,casenum;
    char op[10];
    scanf("%d",&totcase);
    for(casenum = 1;casenum<=totcase;casenum++)
    {
        printf("Case %d:\n",casenum);
        scanf("%d",&n);
        buildsegtree(1,1,n);
        while(scanf("%s",op))
        {
            if(op[0] == 'E')    break;
            if(op[0] == 'A')
            {
                scanf("%d%d",&i,&j);
                add(1,i,j);
            }
            else if(op[0] == 'S')
            {
                scanf("%d%d",&i,&j);
                add(1,i,-j);
            }
            else if(op[0] == 'Q')
            {
                scanf("%d%d",&i,&j);
                printf("%d\n",query(1,i,j));
            }
        }
    }
    return 0;
}
posted on 2011-09-28 13:38  NKHe!!oWor!d  阅读(132)  评论(0编辑  收藏  举报