单点更新
代码挺容易懂的,我就不多说了
查询的时候注意一点就可以了
#include <stdio.h>
#define maxn 50005
int ans;
struct
{
int l, r, sum;
int mid()
{
return (l + r)>>1;
}
}node[maxn*4];
void buildtree(int left, int right, int u)
{
node[u].l = left;
node[u].r = right;
if(left == right)
{
scanf("%d",&node[u].sum);
return;
}
int mid = node[u].mid();
buildtree(left, mid, u<<1);
buildtree(mid+1, right, u<<1|1);
node[u].sum = node[u<<1].sum + node[u<<1|1].sum;
}
void update(int b, int s, int left, int right, int u)
{
if(left==right)
{
node[u].sum+=s;
return;
}
int mid = node[u].mid();
if(b<=mid) update(b, s, left, mid, u<<1);
else if(b>mid) update(b, s, mid+1, right, u<<1|1);
node[u].sum = node[u<<1].sum + node[u<<1|1].sum;
}
void query(int b, int s, int left, int right, int u)
{
if(b<=left && right<=s)
{
ans+=node[u].sum;
return;
}
int mid = node[u].mid();
if(s<=mid) query(b, s, left, mid, u<<1);
else if(mid<b) query(b, s, mid+1, right, u<<1|1);
else
{
query(b, s, left, mid, u<<1);
query(b, s, mid+1, right, u<<1|1);
}
}
int main()
{
int t;
char str[10];
scanf("%d",&t);
int cas=1;
while(t--)
{
int n;
scanf("%d",&n);
buildtree(1, n, 1);
printf("Case %d:\n",cas++);
getchar();
while(scanf("%s",str)!=EOF)
{
int b,s;
getchar();
if(str[0]=='E') break;
scanf("%d%d",&b,&s);
if(str[0]=='A')
{
update(b, s, 1, n, 1);
}
else if(str[0]=='S')
{
update(b, -s, 1, n, 1);
}
else
{
ans=0;
query(b, s, 1, n, 1);
printf("%d\n",ans);
}
}
}
return 0;
}