hdu 1166 敌兵布阵 朴素线段树

来源:互联网 发布:mac 所有软件打不开 编辑:程序博客网 时间:2024/04/29 15:29
#include<stdio.h>#include<string.h>#define MAX 1000001int a[MAX],ci;int find(int left,int right,int i,int j,int num){    int mid=(left+right)/2;    if(left==i&&right==j) return a[num];    else if(i==j) return a[i];    else if(i<=mid&&j>mid)        return find(mid+1,right,mid+1,j,2*num+1)+find(left,mid,i,mid,2*num);    else if(j<=mid) return find(left,mid,i,j,num*2);    else if(i>mid) return find(mid+1,right,i,j,num*2+1);}int main(){    int T;    scanf("%d",&T);    for(int cas=1;cas<=T;cas++)    {        printf("Case %d:\n",cas);        memset(a,0,sizeof(a));        int n;ci=1;        scanf("%d",&n);        while(ci<=n) ci*=2;        for(int i=ci;i<ci+n;i++)            scanf("%d",&a[i]);        for(int i=ci-1;i>0;i--)            a[i]=a[2*i]+a[2*i+1];        char s[10];        while(scanf("%s",s)&&s[0]!='E')        {        //    for(int c=1;c<ci+n;c++)        //                                    printf("%d   ",a[c]);        //        printf("\n");            int i,j;            scanf("%d%d",&i,&j);            if(s[0]=='A')                for(int k=ci+i-1;k>0;k/=2)                    a[k]+=j;            else if(s[0]=='S')                for(int k=ci+i-1;k>0;k/=2)                    a[k]-=j;            else            {                int left=ci,right=ci*2-1;i=i+ci-1;j=ci+j-1;                if(i==j) printf("%d\n",a[i]);                else printf("%d\n",find(left,right,i,j,1));            }        }    }    return 0;}

原创粉丝点击