hdu1166 敌兵布阵 线段树

来源:互联网 发布:用友网络2017最新消息 编辑:程序博客网 时间:2024/04/29 02:07
#include<stdio.h>#include<string.h>int sum[200000],n;void build(int rt,int x,int y,int i,int count){if(x==y)sum[rt]+=count;else{int mid=(x+y)>>1;if(i<=mid)build(rt*2,x,mid,i,count);else build(rt*2+1,mid+1,y,i,count);sum[rt]=sum[rt*2]+sum[rt*2+1];}}int query(int rt,int x,int y,int u,int v){if(u<=x&&y<=v)return sum[rt];else{int mid=(x+y)>>1;if(v<=mid)return query(rt*2,x,mid,u,v);else if(u>=mid+1)return query(rt*2+1,mid+1,y,u,v);elsereturn query(rt*2,x,mid,u,v)+query(rt*2+1,mid+1,y,u,v);}}int main(){int T,t=1;scanf("%d",&T);for(t=1;t<=T;t++){int i,count,x,y;char s[10];scanf("%d",&n);memset(sum,0,sizeof(sum));for(i=1;i<=n;i++){scanf("%d",&count);build(1,1,n,i,count);}printf("Case %d:\n",t);while(~scanf("%s",&s)){if(s[0]=='E')break;else if(s[0]=='A'){scanf("%d%d",&x,&y);build(1,1,n,x,y);}else if(s[0]=='S'){scanf("%d%d",&x,&y);build(1,1,n,x,-y);}else{scanf("%d%d",&x,&y);int ans=query(1,1,n,x,y);printf("%d\n",ans);}}}return 0;}

0 0
原创粉丝点击