hdu 1166 敌兵布阵

来源:互联网 发布:wifi显示不安全网络 编辑:程序博客网 时间:2024/06/05 08:20

/*

基础线段树

*/

#include <stdio.h>#include <string.h>int n,m,f[100001];struct node{int l,r;    int sum;}e[100000*4];void build(int a,int b,int c){if(a==b)    {e[c].l=e[c].r=a;e[c].sum=f[a];return;    }e[c].l=a;e[c].r=b;int mid=(a+b)/2;build(a,mid,2*c);build(mid+1,b,2*c+1);e[c].sum=e[2*c].sum+e[2*c+1].sum;}void add(int a,int c,int val){if(e[c].l==a&&e[c].r==a)    {e[c].sum+=val;return;    }e[c].sum+=val;int mid=(e[c].l+e[c].r)/2;if(a>mid)add(a,2*c+1,val);elseadd(a,2*c,val);}int query(int a,int b,int c){if(e[c].l==a&&e[c].r==b)return e[c].sum;int mid=(e[c].l+e[c].r)/2;if(a>mid)return query(a,b,2*c+1);else if(b<=mid)return query(a,b,2*c);elsereturn query(a,mid,2*c)+query(mid+1,b,2*c+1);}int main(){    int T,tt=0;    scanf("%d",&T);while(T--)    {        tt++;        scanf("%d",&n);int i,j,k;for(i=1;i<=n;i++)scanf("%d",&f[i]);build(1,n,1);char ch[10];int x,y,z;printf("Case %d:\n",tt);while(scanf("%s",ch)&&strcmp("End",ch)!=0)        {if(strcmp(ch,"Query")==0)            {scanf("%d %d",&x,&y);printf("%d\n",query(x,y,1));            }else            {                int flag=1;                if(strcmp("Sub",ch)==0)                flag=-1;scanf("%d%d",&x,&y);add(x,1,flag*y);            }        }    }return 0;}


原创粉丝点击