hdu1166

/*
ID:billat11
LANG:C
TASK:namenum
*/
#include<iostream>
#include<cstdio>
#include<cstdarg>
#include<stdlib.h>
#include<cstring>
#include<cmath>
using namespace std;
const int N=50005;
struct Node
{
    int l;
    int r;
    int num;
}aNode[4*N];
int data[N];
void build(int l,int r,int n)
{
    int mid=(l+r)>>1;
    if(l==r)
    {
        aNode[n].l=l;
        aNode[n].r=r;
        aNode[n].num=data[l];
    }
    else
    {
        aNode[n].l=l;
        aNode[n].r=r;
        build(l,mid,2*n);
        build(mid+1,r,2*n+1);
        aNode[n].num=aNode[2*n].num+aNode[2*n+1].num;
    }
}
int query(int l,int r,int n)
{
    int mid=(aNode[n].l+aNode[n].r)>>1;
    if((aNode[n].l==l)&&(aNode[n].r==r))
    return aNode[n].num;
    else
    {
        if(r<=mid)
            return(query(l,r,2*n));
        else if(l>mid)
            return query(l,r,2*n+1);
        else
            return (query(l,mid,2*n)+query(mid+1,r,2*n+1));
    }
}
void add(int nid,int d,int n)
{
    int mid=(aNode[n].l+aNode[n].r)>>1;
    if((aNode[n].l==nid)&&(aNode[n].r==nid))
    {
        aNode[n].num+=d;
        int newn=(n>>1);
        while(newn>=1)
        {
            aNode[newn].num=aNode[2*newn].num+aNode[2*newn+1].num;
            newn=newn>>1;
        }
    }
    else
    {
        if(nid<=mid)
            add(nid,d,2*n);
        else if(nid>mid)
            add(nid,d,2*n+1);
    }
}
void sub(int nid,int d,int n)
{
    int mid=(aNode[n].l+aNode[n].r)>>1;
    if((aNode[n].l==nid)&&(aNode[n].r==nid))
    {
        aNode[n].num-=d;
        int newn=(n>>1);
        while(newn>=1)
        {
            aNode[newn].num=aNode[2*newn].num+aNode[2*newn+1].num;
            newn=newn>>1;
        }
    }
    else
    {
        if(nid<=mid)
            sub(nid,d,2*n);
        else if(nid>mid)
            sub(nid,d,2*n+1);
    }
}
int main()
{
    int t,id=1,n;
    scanf("%d",&t);
    char cmd[20];
    while(id<=t)
    {  
        int a,b;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&data[i]);
        build(1,n,1);
        printf("Case %d:\n",id);
        while(1)
        {
        scanf("%s",cmd);
        if(cmd[0]=='Q')
        {
            scanf("%d%d",&a,&b);
            int ans=query(a,b,1);
            printf("%d\n",ans);
        }
        else if(cmd[0]=='A')
        {
            scanf("%d%d",&a,&b);
            add(a,b,1);
        }
        else if(cmd[0]=='S')
        {
            scanf("%d%d",&a,&b);
            sub(a,b,1);
        }
        else if(cmd[0]=='E')
            break;
        }
        id++;
    }
  //system("pause");
  return 0;
}

  

posted @ 2012-06-10 16:52  wuzhibin  阅读(1217)  评论(0)    收藏  举报