http://acm.hdu.edu.cn/showproblem.php?pid=1166
单点更新 区间求和 睡前一水~
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
#define MAX 50010
typedef struct
{
int l;
int r;
int sum;
}Tree;
Tree tree[MAX*4];
int n,a[MAX];
char f[10];
int build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].sum=0;
if(l==r)
{
tree[i].sum=a[l];
return 0;
}
int mid=(l+r)/2;
build(i*2,l,mid);
build(i*2+1,mid+1,r);
tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;
}
int cal(int i,int x,int y)
{
int ans=0,mid;
if((x<=tree[i].l)&&(y>=tree[i].r))
return tree[i].sum;
ans=0;
mid=(tree[i].l+tree[i].r)/2;
if (x<=mid) ans= ans+cal(i*2,x,y);
if (y>mid) ans= ans+cal(i*2+1,x,y);
return ans;
}
int sub(int i,int k,int v)
{
tree[i].sum+=v;
if(tree[i].l==tree[i].r)
{
return 0;
}
int mid=(tree[i].l+tree[i].r)/2;
if(mid<k)
sub(i*2+1,k,v);
else
sub(i*2,k,v);
}
int main()
{
int _;
int tt=0;
scanf("%d",&_);
while(_--)
{
tt++;
printf("Case %d:\n",tt);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
while(1)
{
scanf("%s",f);
if(f[0]=='E')
break;
else if(f[0]=='Q')
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d\n",cal(1,i,j));
}
else
{
int k,v;
scanf("%d%d",&k,&v);
if(f[0]=='A')
sub(1,k,v);
else
sub(1,k,-v);
}
}
}
}