[線段樹] HDU 1166 - 敵兵佈陣

線段樹第一題~

#include <stdio.h>
#define lson rt << 1
#define rson rt << 1 | 1
int maxn[50005 << 2], N;
void build(int l, int r, int rt)
{
    if(l == r)
    {
        scanf("%d", &maxn[rt]);
        return ;
    }
    int mid = (l + r) >> 1;
    build(l, mid, lson);
    build(mid + 1, r, rson);
    maxn[rt] = maxn[lson] + maxn[rson];
}
void update(int l, int r, int rt, int where, int val)
{
    maxn[rt] += val;
    if(l == r) return;
    int mid = (l + r) >> 1;
    if(where <= mid) update(l, mid, lson, where, val);
    else update(mid + 1, r, rson, where, val);
}
int query(int l, int r, int rt, int L, int R)
{
    if(L <= l && R >= r) return maxn[rt];
    int mid = (l + r) >> 1;
    int ans = 0;
    if(L <= mid) ans += query(l, mid, lson, L, R);
    if(R > mid) ans += query(mid + 1, r, rson, L, R);
    return ans;
}
int main()
{
    int T, N;
    char ch[100];
    scanf("%d", &T);
    for(int i = 1; i <= T; i++)
    {
        printf("Case %d:\n", i);
        scanf("%d", &N);
        build(1, N, 1);
        int x, y;
        while(scanf("%s", ch) && ch[0] != 'E')
        {
            scanf("%d %d", &x, &y);
            if(ch[0] == 'Q') printf("%d\n", query(1, N, 1, x, y));
            else if(ch[0] == 'A') update(1, N, 1, x, y);
            else if(ch[0] == 'S') update(1, N, 1, x, -y);
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章