HDU

来源:互联网 发布:张良一生 知乎 编辑:程序博客网 时间:2024/06/13 21:34

题意:n个阵营,输入n个数,再多次输入,输入A,i,j表示第i增加j个  S,ij表示第i减少j个  Q,i,j表示查询i到j   E表示 结束

#include<stdio.h>

int s[200005];int addlazy[200005];int a[50005];void pushdown(int id,int ll,int rr){    int mid=(ll+rr)/2;    int ls=2*id,rs=2*id+1;    addlazy[ls]+=addlazy[id];    addlazy[rs]+=addlazy[id];    s[ls]+=(mid-ll+1)*addlazy[id];    s[rs]+=(rr-mid)*addlazy[id];    addlazy[id]=0;}void build(int id,int ll,int rr){    addlazy[id]=0;    if(ll==rr){        s[id]=a[ll];        return;    }    int mid = (ll+rr)/2;    build(2*id,ll,mid);    build(2*id+1,mid+1,rr);    s[id]=s[id*2]+s[id*2+1];}int Query(int id,int ll,int rr,int l,int r){    if(l<=ll&&rr<=r){        return s[id];    }    int mid = (ll+rr)/2;    if(r<=mid)        return Query(id*2,ll,mid,l,r);    else if(l>mid)        return Query(id*2+1,mid+1,rr,l,r);    else        return Query(2*id,ll,mid,l,r)+Query(2*id+1,mid+1,rr,l,r);}void updataAdd(int id,int ll,int rr,int x,int y){    if(x<=ll&&x>=rr){        s[id]=s[id]+(rr-ll+1)*y;        addlazy[id]+=y;        return;    }    pushdown(id,ll,rr);    int mid = (ll+rr)/2;    if(x<=mid)        updataAdd(id*2,ll,mid,x,y);    else        updataAdd(id*2+1,mid+1,rr,x,y);    s[id]=s[id*2]+s[id*2+1];}int main(){    int t;    scanf("%d",&t);    for(int ii=1;ii<=t;ii++){        printf("Case %d:\n",ii);        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)            scanf("%d",a+i);        build(1,1,n);        char q[10];        while(scanf("%s",q)){            if(q[0]=='E')   break;            if(q[0]=='Q'){                int l,r;                scanf("%d%d",&l,&r);                printf("%d\n",Query(1,1,n,l,r));            }            if(q[0]=='A'){                int i,j;                scanf("%d%d",&i,&j);                updataAdd(1,1,n,i,j);            }            if(q[0]=='S'){                int i,j;                scanf("%d%d",&i,&j);                updataAdd(1,1,n,i,0-j);            }        }    }}