HDU1166敌兵布阵
简单的线段树,单点更新及区间求和,不需优化,更新到叶子节点
#include<cstdio>
struct node{
int left,right;
int sum;
}tree[50000*4];
int p,add;
void Build(int l,int r,int cur){
tree[cur].left=l;
tree[cur].right=r;
if(l==r){
scanf("%d",&tree[cur].sum);
return ;
}
int mid=(l+r)/2;
Build(l,mid,cur*2);
Build(mid+1,r,cur*2+1);
tree[cur].sum=tree[cur*2].sum+tree[cur*2+1].sum;
}
void Update(int cur){
if(tree[cur].left==tree[cur].right&&tree[cur].left==p){
tree[cur].sum+=add;
return ;
}
int mid=(tree[cur].left+tree[cur].right)/2;
if(p<=mid)Update(cur*2);
else Update(cur*2+1);
tree[cur].sum=tree[cur*2].sum+tree[cur*2+1].sum;
}
int Query(int l,int r,int cur){
if(l==tree[cur].left&&r==tree[cur].right)return tree[cur].sum;
int mid=(tree[cur].left+tree[cur].right)/2;
if(r<=mid)return Query(l,r,cur*2);
else if(l>mid)return Query(l,r,cur*2+1);
else return Query(l,mid,cur*2)+Query(mid+1,r,cur*2+1);
}
int main(){
int T,n,a,b;
char ch[10];
scanf("%d",&T);
for(int t=1;t<=T;t++){
printf("Case %d:\n",t);
scanf("%d",&n);
Build(1,n,1);
while(1){
scanf("%s",ch);
if(ch[0]=='E')break;
scanf("%d%d",&a,&b);
if(ch[0]=='Q')printf("%d\n",Query(a,b,1));
else if(ch[0]=='A'){p=a;add=b;Update(1);}
else{p=a;add=-b;Update(1);}
}
}
return 0;
}