#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXSIZE = 50005;
int T,n,x,y,a[MAXSIZE],sum[MAXSIZE*4];
char ask[10];
inline void update(int root) //上传节点信息
{
sum[root]=sum[root<<1]+sum[root<<1|1];
}
void build(int now_root, int l, int r) //建立线段树
{
if (l==r)
{
sum[now_root]=a[l];
return;
}
int mid=(l+r)>>1;
build(now_root<<1,l,mid);
build(now_root<<1|1,mid+1,r);
update(now_root);
}
void modify(int i, int l, int r, int x, int d) //修改:在x处加d
{
if (l==r)
{
sum[i]+=d;
return;
}
int mid=(l+r)>>1;
if (x<=mid) modify(i<<1,l,mid,x,d);
else modify(i<<1|1,mid+1,r,x,d);
update(i);
}
int query(int i, int l, int r, int L, int R) //询问L到R区间和
{
if (L<=l&&r<=R)
return sum[i];
int mid=(l+r)>>1;
int ans=0;
if (L<=mid) ans+=query(i<<1,l,mid,L,R);
if (mid<R) ans+=query(i<<1|1,mid+1,r,L,R);
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
build(1,1,n); //建立线段树
scanf("%s",ask+1); //读入操作命令:Add,Query,End
while(ask[1]!='E')
{
scanf("%d%d",&x,&y);
if (ask[1]=='A')
modify(1,1,n,x,y); //在x处加y
if (ask[1]=='Q')
printf("%d\n",query(1,1,n,x,y)); //询问x到y区间和
scanf("%s",ask+1);
}
return 0;
}
这是HDU1166修改后的模板,用线段树维护区间和,支持单点修改和区间查询操作