二叉索引树 -- 区间信息的维护与查询

二叉索引树,俗称树状数组,也叫Fenwick树。

例:

  给定一个n个元素的数组A1, A2, A3, ……, An, 设计一个数据结构,支持以下两种操作。

    1、Add  x  y       :让Ax增加y

    2、Query  L  R    :计算AL + AL+1 + …… + AR

#include <stdio.h>
#include <string.h>

int n, a[110], c[110];

int lowbit(int x)
{
    return x & -x;
}

int sum(int x)
{
    int ans = 0;
    while(x > 0)
    {
        ans += c[x];
        x -= lowbit(x);
    }
    return ans;
}

void Query(int L, int R)
{
    printf("%d\n", sum(R)-sum(L-1));
}

void Add(int x, int y)
{
    while(x <= n)
    {
        c[x] += y;
        x += lowbit(x);
    }
}

int main()
{
    scanf("%d", &n);
    memset(c, 0, (n+1)*sizeof(int));
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++)
        for(int j = i-lowbit(i)+1; j <= i; j++)
            c[i] += a[j];
    int x, y;
    char cmd[10];
    while(scanf("%s", cmd) != EOF)
    {
        if(cmd[0] == 'Q')
        {
            scanf("%d %d", &x, &y);
            Query(x, y);
        }
        else if(cmd[0] == 'A')
        {
            scanf("%d %d", &x, &y);
            Add(x, y);
        }
    }
    return 0;
}

 

posted @ 2013-05-28 21:24  Anti-Magic  阅读(238)  评论(0编辑  收藏  举报