[线段树] HDU 1166 - 敌兵布阵

来源:互联网 发布:超星尔雅网络登录页面 编辑:程序博客网 时间:2024/06/05 00:47

线段树第一题~

#include <stdio.h>#define lson rt << 1#define rson rt << 1 | 1int 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;}
0 0