标签:
hdu 1166 敌兵布阵
单点更新,区间查询和。
http://acm.hdu.edu.cn/showproblem.php?pid=1166
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=50010;
struct ST
{
int l,r;
int sum;
}st[maxn<<2];
void pushUp(int i)
{
st[i].sum=st[i<<1].sum+st[(i<<1)|1].sum;
}
void build(int i,int l,int r)
{
st[i].l=l;
st[i].r=r;
if(st[i].l==st[i].r)
{
rd(st[i].sum);
return;
}
int mid=(st[i].l+st[i].r)>>1;
build(i<<1,l,mid);
build((i<<1)|1,mid+1,r);
pushUp(i);
}
void add(int i,int p,int val)
{
if(st[i].l==st[i].r)
{
st[i].sum+=val;
return;
}
int mid=(st[i].l+st[i].r)>>1;
if(p<=mid)
add(i<<1,p,val);
else
add((i<<1)|1,p,val);
pushUp(i);
}
int query(int i,int L,int R)
{
if(st[i].l==L&&st[i].r==R)
{
return st[i].sum;
}
int mid=(st[i].l+st[i].r)>>1;
if(R<=mid)
return query(i<<1,L,R);
else if(L>mid)
return query((i<<1)|1,L,R);
else
return query(i<<1,L,mid)+query((i<<1)|1,mid+1,R);
}
int n;
char cm[10];
int main()
{
int cas=1;
int t;rd(t);
while(t--)
{
printf("Case %d:\n",cas++);
rd(n);
build(1,1,n);
while(scanf("%s",cm))
{
if(cm[0]=='Q')
{
int l,r;
rd2(l,r);
printf("%d\n",query(1,l,r));
}
else if(cm[0]=='A')
{
int p,val;
rd2(p,val);
add(1,p,val);
}
else if(cm[0]=='S')
{
int p,val;
rd2(p,val);
add(1,p,-val);
}
else
break;
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/sr_19930829/article/details/43883395