普通的树状数组C[i]=a[i]+a[i-1]+...a[i-2^k+1]+...+a[1];
但是所有树状数组都是向上更新,向下求和。
1)、单点增减+区间求和
思路:C[x]表示该点的元素:sum(x)=C[1]+C[2]+……C[x](2)、区间增减+单点查询
思路:C[x]表示该点元素与左边元素的差值:num[x]=C[1]+C[2]+……C[x]
(3)、区间增减+区间查询
思路:C1[x]表示该点元素与左边的差值,C2[x]表示的是x*C[x]
/*
* Author: ktmzgl
* Created Time: 2016/9/27 15:16:41
* File Name: F:\Vim\code\Martix_BIT_poj2155.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <time.h>
using namespace std;
const int maxint = -1u>>1;
const int N=1010;
int Scan()
{ //输入外挂 仅适用于纯数字,即不含符号的数字
int res = 0, flag = 0;
char ch;
if((ch = getchar()) == '-')
flag = 1;
else if(ch >= '0' && ch <= '9')
res = ch - '0';
while((ch = getchar()) >= '0' && ch <= '9')
res = res * 10 + (ch - '0');
return flag ? -res : res;
}
void Out(int a)
{ //输出外挂
if(a < 0)
{
putchar('-');
a = -a;
}
if(a >= 10)
Out(a / 10);
putchar(a % 10 + '0');
}
struct BIT
{
int a[N][N];
void init()
{
memset(a,0,sizeof(a));
}
void add(int x,int y,int t)
{
int i,j;
for(i=x;i<N;i+=i&-i)
{
for(j=y;j<N;j+=j&-j) a[i][j]+=t;
}
}
int get(int x,int y)
{
int ans=0;
int i,j;
for(i=x;i;i-=i&-i)
{
for(j=y;j;j-=j&-j) ans+=a[i][j];
}
return ans;
}
};
BIT a,b,c,d;
void add(int x1,int y1,int x2,int y2,int t)
{
a.add(x1,y1,t); a.add(x2+1,y1,-t);
a.add(x1,y2+1,-t); a.add(x2+1,y2+1,t);
b.add(x1,y1,t*x1); b.add(x2+1,y1,-t*(x2+1));
b.add(x1,y2+1,-t*x1); b.add(x2+1,y2+1,t*(x2+1));
c.add(x1,y1,t*y1); c.add(x2+1,y1,-t*y1);
c.add(x1,y2+1,-t*(y2+1)); c.add(x2+1,y2+1,t*(y2+1));
d.add(x1,y1,t*x1*y1); d.add(x2+1,y1,-t*(x2+1)*y1);
d.add(x1,y2+1,-t*x1*(y2+1)); d.add(x2+1,y2+1,t*(x2+1)*(y2+1));
}
//区间修改区间求和的时候树状数组存的是差量
int get(int x,int y)//求1,1到x,y的和
{
return (x+1)*(y+1)*a.get(x,y)-(y+1)*b.get(x,y)-(x+1)*c.get(x,y)+d.get(x,y);
}
int get(int x1,int y1,int x2,int y2)//求x1,y1到x2,y2的和
{
return get(x2,y2)-get(x2,y1-1)-get(x1-1,y2)+get(x1-1,y1-1);
}
int main()
{
int t;
scanf("%d",&t);
int cnt=0;
while(t--)
{
if(cnt!=0)
cout<<endl;
cnt++;
int n,m;
scanf("%d%d",&n,&m);
a.init(),b.init(),c.init(),d.init();
char op[10];
int x1,y1,x2,y2;
for(int i=0;i<m;i++)
{
scanf("%s",op);
if(op[0]=='C')
{
//scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1=Scan(),y1=Scan(),x2=Scan(),y2=Scan();
add(x1,y1,x2,y2,1);
}
else
{
//scanf("%d%d",&x1,&y1);
x1=Scan(),y1=Scan();
cout<<get(x1,y1,x1,y1)%2<<endl;
}
}
}
return 0;
}