hdu 1166 敌兵布阵

来源:互联网 发布:哪个贷款软件最靠谱 编辑:程序博客网 时间:2024/05/26 22:57

AC代码:

#include <iostream>#include <cstdio>using namespace std;const int N = 50005;struct node{    int l,r,sum;}tree[N<<2];int a[N];void build(int m,int l,int r){    tree[m].l = l;    tree[m].r = r;    if(l == r){        tree[m].sum = a[l];        return ;    }    int mid = (l+r)>>1;    build(m<<1,l,mid);    build((m<<1)|1,mid+1,r);    tree[m].sum = tree[m<<1].sum+tree[(m<<1)|1].sum;}void update(int m,int x,int val){    if(tree[m].l == x && tree[m].r == x){        tree[m].sum += val;        return ;    }    int mid = (tree[m].l+tree[m].r)>>1;    if(x <= mid)        update(m<<1,x,val);    else        update((m<<1)|1,x,val);    tree[m].sum = tree[m<<1].sum+tree[(m<<1)|1].sum;}int query(int m,int l,int r){    if(tree[m].l == l && tree[m].r == r)        return tree[m].sum;    int mid = (tree[m].l+tree[m].r)>>1;    if(r <= mid)        return query(m<<1,l,r);    if(l > mid)        return query((m<<1)|1,l,r);    return query(m<<1,l,mid)+query((m<<1)|1,mid+1,r);}int main(){    int T,t = 1;    scanf("%d",&T);    while(T--){        int n;        scanf("%d",&n);        for(int i = 1; i <= n; i++)            scanf("%d",&a[i]);        build(1,1,n);        printf("Case %d:\n",t++);        char op[10];        int x,y;        while(1){            scanf("%s",op);            if(op[0] == 'Q'){                scanf("%d%d",&x,&y);                printf("%d\n",query(1,x,y));            }            else if(op[0] == 'A'){                scanf("%d%d",&x,&y);                update(1,x,y);            }            else if(op[0] == 'S'){                scanf("%d%d",&x,&y);                update(1,x,-y);            }            else if(op[0] == 'E')                break;        }    }    return 0;}


0 0