思路:单点更新区间求和树状数组(只用到区间求和树状数组更简单方便)
AC代码;
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
#define N 50010
int dp[N], n;
int lowbit(int x)
{
return x & (-x);
}
void add(int x, int d)
{
while (x <= n)
{
dp[x] += d;
x += lowbit(x);
}
}
int sum(int x)
{
int ret = 0;
while (x > 0)
{
ret += dp[x];
x -= lowbit(x);
}
return ret;
}
int main()
{
int t, k = 1;
scanf("%d", &t);
while (t--)
{
memset(dp, 0, sizeof(dp));
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
add(i, x);
}
printf("Case %d:\n", k++);
char a[100];
while (scanf("%s", a) != EOF)
{
if (a[0] == 'E') break;
int l, r;
scanf("%d%d", &l, &r);
if (a[0] == 'Q')
printf("%d\n", sum(r) - sum(l - 1)); //注意l-r的区间和
if (a[0] == 'A')
add(l, r);
if (a[0] == 'S')
add(l, -r);
}
}
return 0;
}