线段树—hdu1166

来源:互联网 发布:java垃圾回收原理 编辑:程序博客网 时间:2024/06/01 09:19

hdu1166

#include<cstdio>#include<cstring>using namespace std;struct node{    int l,r,n;}t[50005*3];//一定要是三倍,结构体!!!别问我为什么要强调这个int sum;void build(int l,int r,int k){    t[k].l=l;t[k].r=r;t[k].n=0;    if(l==r) return;    int mid=(r+l)>>1;    build(l,mid,2*k);    build(mid+1,r,2*k+1);}void updata(int a,int n,int k){    if(t[k].l==t[k].r&&t[k].l==a)    {        t[k].n+=n;        return ;    }    int mid=(t[k].l+t[k].r)>>1;    if(a<=mid)        updata(a,n,2*k);    else        updata(a,n,2*k+1);    t[k].n=t[2*k].n+t[2*k+1].n;}void sea(int l,int r,int k){    if(t[k].l==l&&t[k].r==r)    {        sum+=t[k].n;        return;    }    int mid=(t[k].l+t[k].r)>>1;    if(r<=mid)        sea(l,r,2*k);    else if(l>mid)        sea(l,r,2*k+1);    else    {        sea(l,mid,2*k);        sea(mid+1,r,2*k+1);    }}int main(){    char s[10];    int T,cnt=1;    scanf("%d",&T);    while(T--)    {        int n;        printf("Case %d:\n",cnt++);        scanf("%d",&n);        build(1,n,1);        for(int i=1;i<=n;i++)        {            int temp;            scanf("%d",&temp);            updata(i,temp,1);        }        while(scanf("%s",s)&&strcmp(s,"End"))        {            int a,b;            scanf("%d%d",&a,&b);            if(!strcmp(s,"Add"))                updata(a,b,1);            if(!strcmp(s,"Sub"))                updata(a,-b,1);            if(!strcmp(s,"Query"))            {                sum=0;                sea(a,b,1);                printf("%d\n",sum);            }        }    }    return 0;}

0 0