hdu1166敌兵布阵(线段树点修改)

来源:互联网 发布:linux alien 编辑:程序博客网 时间:2024/05/22 04:46
#include<stdio.h>#include<string.h>#include<algorithm>#define N 50000+20using namespace std;int a[N];struct Nodes{    int l,r,sum;}node[N<<2];void Build(int root,int l,int r){    node[root].l=l;    node[root].r=r;    if(l==r)return ;    int mid=(l+r)>>1;    Build(root<<1,l,mid);    Build((root<<1)+1,mid+1,r);}void Update(int root,int pos,int v){    if(node[root].l==node[root].r&&node[root].l==pos)    {        node[root].sum+=v;        return ;    }    int mid=(node[root].l+node[root].r)>>1;    if(pos<=mid)Update(root<<1,pos,v);    else Update((root<<1)+1,pos,v);    node[root].sum=node[root<<1].sum+node[(root<<1)+1].sum;}int Query(int root,int l,int r){    if(node[root].l==l&&node[root].r==r)        return node[root].sum;    int mid=(node[root].l+node[root].r)>>1;    if(r<=mid)return Query(root<<1,l,r);    else if(l>=mid+1)return Query((root<<1)+1,l,r);    else return Query(root<<1,l,mid)+Query((root<<1)+1,mid+1,r);}int main(){    int T,n,l,r,pos,v,C=0;    char act[10];    scanf("%d",&T);    while(T--)    {        memset(node,0,sizeof(node));        scanf("%d",&n);        Build(1,1,n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);            Update(1,i,a[i]);        }        printf("Case %d:\n",++C);        while(scanf("%s",act))        {            if(!strcmp(act,"End"))break;            if(!strcmp(act,"Query"))            {                scanf("%d%d",&l,&r);                printf("%d\n",Query(1,l,r));            }            else if(!strcmp(act,"Add"))            {                scanf("%d%d",&pos,&v);                Update(1,pos,v);            }            else if(!strcmp(act,"Sub"))            {                scanf("%d%d",&pos,&v);                Update(1,pos,-v);            }        }    }    return 0;}

0 0