您的位置:首页 > 其它

HDU 1166 敌兵布阵

2011-06-01 20:10 316 查看
#include<stdio.h>
int N;
const int MAX=50010;
int numbers[MAX];
char s[7];
struct line
{
int left;
int right;
int maxNum;
};
line lines[MAX<<2];
void buildTree(int le,int ri,int root)
{
lines[root].left=le;
lines[root].right=ri;
if(le==ri)
{
lines[root].maxNum=numbers[le];
return ;
}
int mid=(le+ri)>>1;
buildTree(le,mid,root<<1);
buildTree(mid+1,ri,(root<<1)+1);
lines[root].maxNum=lines[root<<1].maxNum+lines[(root<<1)+1].maxNum;
}
int query(int le,int ri,int root)
{
if(lines[root].left==le&&lines[root].right==ri)
{
return lines[root].maxNum;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(ri<=mid)
{
return query(le,ri,root<<1);
}else
if(mid+1<=le)
{
return query(le,ri,(root<<1)+1);
}else
{
return query(le,mid,root<<1)+query(mid+1,ri,(root<<1)+1);
}
}
void modify(int id,int root,int data)
{
if(lines[root].left==id&&lines[root].right==id)
{
lines[root].maxNum+=data;
return ;
}
int mid=(lines[root].left+lines[root].right)>>1;
if(id<=mid)
{
modify(id,root<<1,data);
}else
{
modify(id,(root<<1)+1,data);
}
lines[root].maxNum=lines[root<<1].maxNum+lines[root*2+1].maxNum;
}
int main()
{
int cases=0;
int T;
scanf("%d",&T);
while(T--)
{
cases++;
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
scanf("%d",&numbers[i]);
}
buildTree(1,N,1);
printf("Case %d:\n",cases);
while(scanf("%s",s))
{

if(s[0]=='E')
{
break;
}
int a,b;
scanf("%d%d",&a,&b);

if(s[0]=='A')
{
modify(a,1,b);
continue;
}
if(s[0]=='S')
{
modify(a,1,-b);
continue;
}
else
printf("%d\n",query(a,b,1));
}
}
return 0;

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