#include <istream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
using namespace std;
int arr[50005], tree[50005 * 4];
void buildtree(int node, int start, int end)
{
if (start == end)
tree[node] = arr[end];
else
{
int mid = (start + end) / 2;
int lnode = node * 2 + 1;
int rnode = node * 2 + 2;
buildtree(lnode, start, mid);
buildtree(rnode, mid + 1, end);
tree[node] = tree[lnode] + tree[rnode];
}
}
void add(int node, int start, int end, int address, int val)
{
if (start == end)
{
arr[address] += val;
tree[node] += val;
}
else
{
int mid = (start + end) / 2;
int lnode = node * 2 + 1;
int rnode = node * 2 + 2;
if (address <= mid)
add(lnode, start, mid, address, val);
else
add(rnode, mid + 1, end, address, val);
tree[node] = tree[lnode] + tree[rnode]; //改完之后更新
}
}
void sub(int node, int start, int end, int address, int val)
{
if (start == end)
{
arr[address] -= val;
tree[node] -= val;
}
else
{
int mid = (start + end) / 2;
int lnode = node * 2 + 1;
int rnode = node * 2 + 2;
if (address <= mid)
sub(lnode, start, mid, address, val);
else
sub(rnode, mid + 1, end, address, val);
tree[node] = tree[lnode] + tree[rnode]; //改完之后更新
}
}
int query(int node, int start, int end, int L, int R)
{
if (R < start || L > end)
return 0;
else if (start == end)
return tree[node];
else if (L <= start && R >= end)
return tree[node];
else
{
int mid = (start + end) / 2;
int lnode = node * 2 + 1;
int rnode = node * 2 + 2;
return query(lnode, start, mid, L, R) + query(rnode, mid + 1, end, L, R);
}
}
int main()
{
int t;
scanf("%d", &t);
int k;
for (k = 1; k <= t; k++)
{
int n;
scanf("%d", &n);
int i;
for (i = 1; i <= n; i++)
scanf("%d", &arr[i]);
printf("Case %d:\n", k);
buildtree(1, 1, n);
char s[6];
while (scanf("%s", s) && strcmp(s, "End") != 0)
{
if (s[0] == 'Q')
{
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", query(1, 1, n, a, b));
}
else if (s[0] == 'A')
{
int a, b;
scanf("%d %d", &a, &b);
add(1, 1, n, a, b);
}
else
{
int a, b;
scanf("%d %d", &a, &b);
sub(1, 1, n, a, b);
}
}
// for (i = 1; i <= n; i++)
// printf("%d ", arr[i]);
}
return 0;
}
我首先是开了tree[5000 * 3]的数组,但是TLE了,其实也是RUNTIME,然后开了tree[5000 * 4]AC了;
具体的个数网上都能查到,也非常好计算。