hdu1166 敌兵布阵(线段树)

View Code
#include<stdio.h>
#include<string.h>
const  int MAXN=50005;
struct ty{
    int l,r;
    int num;
};
int num[MAXN];
ty dat[MAXN*3];

int Build(int a,int b,int i){
    dat[i].l=a;
    dat[i].r=b;
    if(a==b) return dat[i].num=num[a];
    int mid=(a+b)>>1;
    return dat[i].num=Build(a,mid,i<<1)+Build(mid+1,b,i<<1|1);
}

void Add(int a,int b,int i){
    dat[i].num+=b;
    if(dat[i].l==a && dat[i].r==a) return;
    int mid=(dat[i].l+dat[i].r)>>1;
    if(a<=mid) Add(a,b,i<<1);
    else Add(a,b,i<<1|1);
}

int Query(int a,int b,int i){
    if(dat[i].l==a && dat[i].r==b) return dat[i].num;
    int mid=(dat[i].l+dat[i].r)>>1;
    if(b<=mid) return Query(a,b,i<<1);
    else if(a>mid) return Query(a,b,i<<1|1);
    else return Query(a,mid,i<<1)+Query(mid+1,b,i<<1|1);
}
int main(){
    //freopen("in.txt","r",stdin);
    int t,index,n,a,b;
    char cmd[16];
    scanf("%d",&t);
    for(index=1;index<=t;index++){
        printf("Case %d:\n",index);
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++){
            scanf("%d",num+i);
        }
        Build(1,n,1);
        while(scanf("%s",cmd),cmd[0]!='E'){
            scanf("%d%d",&a,&b);
            if(cmd[0]=='A') Add(a,b,1);
            else if(cmd[0]=='S') Add(a,-b,1);
            else printf("%d\n",Query(a,b,1));
        }
    }
    return 0;
}

 

posted @ 2012-12-09 22:05  sumaoqing123  阅读(123)  评论(0编辑  收藏  举报