1 /* 2 写于13年3月21日 3 单点更新,区间求和,二维树状数组 4 输入x1,x2,y1,y2时,输成了x1,y1,x2,y2。调试了两个小时,汗! 5 6 注意:i=0||j=0时,lowbit()返回0 ,add()函数会进入死循环 7 所以数据输入后进行自加操作 8 */ 9 #include10 #include 11 #include 12 using namespace std;13 const int maxn=1010;14 int tree[maxn][maxn];15 int marked[maxn][maxn];16 int lowbit(int i)17 {18 return i&(-i);19 }20 void add(int x,int y,int num)21 {22 //i=0||j=0时,lowbit()返回0 ,死循环23 for(int i=x;i<=maxn;i+=lowbit(i))24 {25 for(int j=y;j<=maxn;j+=lowbit(j))26 {27 28 tree[i][j]+=num;29 }30 31 }32 }33 int sum(int x,int y)34 {35 int ans=0;36 for(int i=x;i>0;i-=lowbit(i))37 {38 for(int j=y;j>0;j-=lowbit(j))39 {40 ans+=tree[i][j];41 }42 }43 44 return ans;45 }46 int main()47 {48 int n;49 char c;50 int x1,y1,x2,y2;51 sum(0,0);52 while(cin>>n)53 {54 memset(marked,0,sizeof(marked));//标记该点的亮灭,决定是否更新55 while(n--)56 {57 //还有就是C中的输入字符操作真心不好操控啊!58 cin>>c;59 if(c=='B')60 {61 cin>>x1>>y1;62 x1++,y1++;63 if(!marked[x1][y1])64 {65 marked[x1][y1]=1;66 add(x1,y1,1);67 }68 }69 else if(c=='D')70 {71 cin>>x1>>y1;72 x1++,y1++;73 if(marked[x1][y1])74 {75 marked[x1][y1]=0;76 add(x1,y1,-1);77 }78 }79 else if(c=='Q')80 {81 cin>>x1>>x2>>y1>>y2;82 x1++,y1++;83 x2++,y2++;84 if(x1