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;}