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

二叉索引树,俗称树状数组,也叫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;

}

 

你可能感兴趣的:(索引)