注意树状数组下标
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool vis[1005][1005];
int map[1005][1005];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int num)
{
for(int i = x;i <=1002;i+=lowbit(i))
for(int j = y;j <= 1002;j+=lowbit(j))
map[i][j] += num;
}
int get_sum(int x,int y)
{
int res = 0;
for(int i = x;i > 0;i -= lowbit(i))
for(int j = y;j > 0;j -= lowbit(j))
res += map[i][j];
return res;
}
int main()
{
int n,x,y,x1,y1;
char c;
while(~scanf("%d",&n))
{
memset(vis,false,sizeof(vis));
memset(map,0,sizeof(map));
for(int i = 0;i < n;i++)
{
cin>>c;
if(c=='B')
{
cin>>x>>y;
if(!vis[x+1][y+1])
add(x+1,y+1,1);
vis[x+1][y+1] = true;
}
else if(c=='D')
{
cin>>x>>y;
if(vis[x+1][y+1])
{
add(x+1,y+1,-1);
vis[x+1][y+1] = false;
}
}
else
{
cin>>x>>x1>>y>>y1;
int min1,min2,max1,max2;
min1 = min(x+1,x1+1);min2 = min(y+1,y1+1);
max1 = max(x+1,x1+1);max2 = max(y+1,y1+1);
int k = get_sum(max1,max2) - get_sum(min1-1,max2) - get_sum(max1,min2-1) + get_sum(min1-1,min2-1);
printf("%d\n",k);
}
}
}
}