题意:裸树状数组,点更新区间查询
第一道树状数组,写的很详细
#include <bits/stdc++.h>
using namespace std;
const int maxn = 51000;
int arr[maxn];
int tree[maxn];
int n;
int lowbit(int x)
{
return x & -x;
}
void update(int pos, int delta)
{
while (pos <= n) {
tree[pos] += delta;
pos += lowbit(pos);
}
}
int query(int pos)
{
if (pos == 0)
return 0;
int ret = 0;
while (pos) {
ret += tree[pos];
pos -= lowbit(pos);
}
return ret;
}
enum CMD_TYPE{CMD_QUERY, CMD_ADD, CMD_SUB, CMD_END};
int get_cmd()
{
int ret;
char cmd_str[10];
scanf("%s", cmd_str);
switch (cmd_str[0]) {
case 'Q':
ret = CMD_QUERY;
break;
case 'S':
ret = CMD_SUB;
break;
case 'A':
ret = CMD_ADD;
break;
default:
ret = CMD_END;
break;
}
return ret;
}
void do_query()
{
int fr, to;
scanf("%d%d", &fr, &to);
printf("%d\n", query(to) - query(fr-1));
}
void do_add()
{
int pos, delta;
scanf("%d%d", &pos, &delta);
update(pos, delta);
}
void do_sub()
{
int pos, delta;
scanf("%d%d", &pos, &delta);
update(pos, -delta);
}
int main()
{
int T;
scanf("%d", &T);
for (int ca = 1; ca <= T; ca++) {
printf("Case %d:\n", ca);
scanf("%d", &n);
memset(tree, 0, sizeof(tree));
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
update(i, arr[i]);
}
int cmd;
while ((cmd = get_cmd()) != CMD_END) {
switch (cmd) {
case CMD_QUERY:
do_query();
break;
case CMD_ADD:
do_add();
break;
case CMD_SUB:
do_sub();
break;
default:
break;
}
}
}
return 0;
}