hdu1166--敌兵布阵(单点更新)

题目大意:中文题啦。。


分析:线段树。单点更新。区间求和。


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 50010;

int n, sum[4*maxn];

void PushUP(int root) {
    sum[root] = sum[root*2+1]+sum[root*2+2];
}

void Build(int root, int l, int r) {
    if(l == r) {
        scanf("%d", &sum[root]);
        return;
    }
    Build(root*2+1, l, (l+r)/2);
    Build(root*2+2, (l+r)/2+1, r);
    PushUP(root);
}

void update(int root, int l, int r, int p, int x) {
    if(l == r) {
        sum[root] += x;
        return;
    }
    int m = (l+r)/2;
    if(p <= m) update(root*2+1, l, m, p, x);
    else update(root*2+2, m+1, r, p, x);
    PushUP(root);
}

int query(int root, int l, int r, int L, int R) {
    if(L <= l && r <= R) {
        return sum[root];
    }
    int m = (l+r)/2;
    int ans = 0;
    if(L <= m) ans += query(root*2+1, l, m, L, R);
    if(R > m) ans += query(root*2+2, m+1, r, L, R);
    return ans;
}

int main() {
    int T;
    scanf("%d", &T);
    for(int i = 1; i <= T; i++) {
        printf("Case %d:\n", i);
        memset(sum , 0, sizeof(sum));
        scanf("%d", &n);
        Build(0, 1, n);
        char op[10];
        while(scanf("%s", op)) {
            if(op[0] == 'E') break;
            int a, b;
            scanf("%d%d", &a, &b);
            if(op[0] == 'Q')
                printf("%d\n", query(0, 1, n, a, b));
            else if(op[0] == 'A')
                update(0, 1, n, a, b);
            else update(0, 1, n, a, -b);
        }
    }
    return 0;
}



你可能感兴趣的:(hdu1166--敌兵布阵(单点更新))