HDU 1166 敌兵布阵

线段树的基础题,之前写过,今天看了刘汝佳的《高级数据结构》又写了一次,对线段树的理解也更深了。

/*2012-08-07 15:45:14    Accepted    1166    343MS    736K    1598 B    G++    Yu*/

#include<stdio.h>

#include<string.h>



#define lson l, m, rt << 1

#define rson m + 1, r, rt << 1 | 1



const int MAXN = 50050;

int sum[MAXN << 2];

int n;



void PushUp(int rt)

{

    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];

}



void build(int l, int r, int rt)

{

    int m = l + r >> 1;

    if(l == r)

    {

        scanf("%d", &sum[rt]);

        return;

    }

    build(lson);

    build(rson);

    PushUp(rt);

}



void update(int p, int c, int l, int r, int rt)

{

    int m = l + r >> 1;

    if(l == r)

    {

        sum[rt] += c;

        return;

    }

    if(p <= m) update(p, c, lson);

    else update(p, c, rson);

    PushUp(rt);

}



int query(int L, int R, int l, int r, int rt)

{

    int m = l + r >> 1, res = 0;

    if(L <= l && r <= R)

    {

        return sum[rt];

    }

    if(L <= m) res += query(L, R, lson);

    if(R > m) res += query(L, R, rson);

    return res;

}



void operation()

{

    char op[5];

    int a, b;

    while(true)

    {

        scanf("%s", op);

        if('E' == op[0]) break;

        else

        {

            scanf("%d%d", &a, &b);

            if('A' == op[0])

                update(a, b, 1, n, 1);

            else if('S' == op[0])

                update(a, -b, 1, n, 1);

            else

                printf("%d\n", query(a, b, 1, n, 1));

        }

    }

}



int main()

{

    int T, cas;

    scanf("%d", &T);

    for(cas = 1; cas <= T; cas ++)

    {

        scanf("%d", &n);

        build(1, n, 1);

        printf("Case %d:\n", cas);

        operation();

    }

    return 0;

}

 

你可能感兴趣的:(HDU)