和前一个二维树状数组基本一样,果断1A
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define LEN 1002
int tree[LEN+2][LEN+2];
int flag[LEN][LEN];
int lowbit(int x) {
return x & (-x);
}
void update(int x, int y, int val) {
for(int i = x; i <= LEN; i += lowbit(i)) {
for(int j = y; j <= LEN; j += lowbit(j)) {
tree[i][j] += val;
}
}
}
int query(int x, int y) {
int sum = 0;
for(int i = x; i > 0; i -= lowbit(i)) {
for(int j = y; j > 0; j -= lowbit(j)) {
sum += tree[i][j];
}
}
return sum;
}
int main() {
int m;
while(scanf("%d", &m) != EOF) {
char cmd[3];
int x1, x2, y1, y2;
memset(flag, 0, sizeof(flag));
while(m--) {
scanf("%s", cmd);
if('B' == cmd[0]) {
scanf("%d%d", &x1, &y1);
if(0 == flag[x1+1][y1+1]) {
update(x1+1, y1+1, 1);
flag[x1+1][y1+1] = 1;
}
}
else if('Q' == cmd[0]) {
scanf("%d%d%d%d", &x1, &x2, &y1, &y2);
int tmp;
if(x1 > x2) {
tmp = x1;
x1 = x2;
x2 = tmp;
}
if(y1 > y2) {
tmp = y1;
y1 = y2;
y2 = tmp;
}
int ans = query(x2+1, y2+1) + query(x1, y1) - query(x1, y2+1) - query(x2+1, y1);
printf("%d\n", ans);
}
else if('D' == cmd[0]) {
scanf("%d%d", &x1, &y1);
if(1 == flag[x1+1][y1+1]) {
update(x1+1, y1+1, -1);
flag[x1+1][y1+1] = 0;
}
}
}
}
return 0;
}