您的位置:首页 > 其它

HDOJ 1166

2014-04-30 18:36 337 查看

#include<stdio.h>
#include<string.h>
#define MAX 50000
#define L(x) (x << 1)
#define R(x) (x << 1|1)
typedef struct
{
int left;
int right;
int sum;
}Node;
Node node[4*MAX];
int cnt;
void build(int l,int r,int k)
{
node[k].left = l;
node[k].right = r;
node[k].sum = 0;
if(l == r)
return ;
int mid = (l + r) >> 1;
build(l,mid,L(k));
build(mid+1,r,R(k));
}

void insert(int pos,int num,int k)
{
if(pos >= node[k].left && pos <= node[k].right)
node[k].sum += num;
if(node[k].left == node[k].right)
return ;
if(pos <= node[L(k)].right)
insert(pos,num,L(k));
else
insert(pos,num,R(k));
}

void get_result(int l,int r,int k)
{
if(l == node[k].left && r == node[k].right)
{
cnt += node[k].sum;
return ;
}
if(node[k].left == node[k].right)
return ;
if(r < node[R(k)].left)
get_result(l,r,L(k));
else if(l > node[L(k)].right)
get_result(l,r,R(k));
else
{
get_result(l,node[L(k)].right,L(k));
get_result(node[R(k)].left,r,R(k));
}
}

int main()
{
int T,n,i,j,k;
char str[10];
scanf("%d",&T);
k = 0;
while(T--)
{
k ++;
memset(str,0,sizeof(str));
scanf("%d",&n);
build(1,n,1);
for(i = 1;i <= n;i ++)
{
scanf("%d",&j);
insert(i,j,1);
}
scanf("%s",str);
int flag = 0;
while(strcmp(str,"End"))
{
if(!strcmp(str,"Query") && !flag)
{
printf("Case %d:\n",k);
flag = 1;
}
if(!strcmp(str,"Query"))
{
cnt = 0;
scanf("%d%d",&i,&j);
get_result(i,j,1);
printf("%d\n",cnt);
}
if(!strcmp(str,"Add"))
{
scanf("%d%d",&i,&j);
insert(i,j,1);
}
if(!strcmp(str,"Sub"))
{
scanf("%d%d",&i,&j);
insert(i,-j,1);
}
memset(str,0,sizeof(str));
scanf("%s",str);
}
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: