线段树之HDU1166 敌兵布阵

来源:互联网 发布:建筑平面设计软件 编辑:程序博客网 时间:2024/03/29 08:59

最基础的改点求段,可以用来练模板。

#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <math.h>#include <algorithm>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int MAXN=50010;int sum[MAXN<<2];int a[MAXN];inline void PushUp(int rt)<span style="white-space:pre"></span>//修改父节点{    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt)//建树{    if(l==r)    {       sum[rt]=a[l];        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);    PushUp(rt);}//单点更新,根据要更新的点的下标 来递归void update(int id,int add,int l,int r,int rt){    if(l==r)    {        sum[rt]+=add;        return;    }    int m=(l+r)>>1;    if(id<=m)        update(id,add,lson);    else        update(id,add,rson);    PushUp(rt);}int query(int L,int R,int l,int r,int rt){    if( L<=l && r<=R )        return sum[rt];       int m=(l+r)>>1;    if(R<=m)return query(L,R,lson);else if(L>m)return query(L,R,rson);elsereturn query(L,R,lson)+query(L,R,rson);}int main(){    int T;int cas;int n,i,j;char s[50];int x,y;while(scanf("%d",&T)!=EOF){for(cas=1;cas<=T;cas++){scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);build(1,n,1);printf("Case %d:\n",cas);while(1){scanf("%s",s);if(strcmp(s,"End")==0)break;scanf("%d%d",&x,&y);if(strcmp(s,"Add")==0)update(x,y,1,n,1);if(strcmp(s,"Sub")==0)update(x,-y,1,n,1);if(strcmp(s,"Query")==0)printf("%d\n",query(x,y,1,n,1));}}}return 0;}


0 0