//POJ 2155 Matrix 二维线段树/二维树状数组
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <algorithm>
#include <ctime>
using namespace std;
const int inf=1<<30;
bool ltree[2500][2500];
int n;
bool ans;
void modify_y(int rx,int ry,int down,int up,int y1,int y2)
{
if ( down==y1 && up==y2)
{
ltree[rx][ry]^=1;
return ;
}
int mid=(down+up)>>1;
if (y2<=mid)
modify_y(rx,(ry<<1),down,mid,y1,y2);
else if (y1>mid)
modify_y(rx,(ry<<1)+1,mid+1,up,y1,y2);
else
{
modify_y(rx,ry<<1,down,mid,y1,mid);
modify_y(rx,(ry<<1)+1,mid+1,up,mid+1,y2);
}
}
void modify_x(int root,int l,int r,int x1,int x2,int y1,int y2)
{
if (l==x1 && r==x2)
{
modify_y(root,1,1,n,y1,y2);
return ;
}
int mid=(l+r)>>1;
if (x2<=mid)
modify_x(root<<1,l,mid,x1,x2,y1,y2);
else if (x1>mid)
modify_x((root<<1)+1,mid+1,r,x1,x2,y1,y2);
else {
modify_x(root<<1,l,mid,x1,mid,y1,y2);
modify_x((root<<1)+1,mid+1,r,mid+1,x2,y1,y2);
}
}
void require_y(int rx,int ry,int down,int up,int y)
{
ans^=ltree[rx][ry];
if (down==up) return;
int mid=(down+up)>>1;
if (y<=mid) require_y(rx,ry<<1,down,mid,y);
else require_y(rx,(ry<<1)+1,mid+1,up,y);
}
void require_x(int root,int l,int r,int x,int y)
{
require_y(root,1,1,n,y);
if (l==r)
return ;
int mid=(l+r)>>1;
if (x<=mid) require_x(root<<1,l,mid,x,y);
else require_x((root<<1)+1,mid+1,r,x,y);
}
int main()
{
int t,ins,x1,x2,y1,y2;
char ch;
scanf("%d",&t);
while (t--)
{
memset(ltree,false,sizeof(ltree));
scanf("%d%d",&n,&ins);
while (ins--)
{
while (scanf("%c",&ch) && ch!='C' && ch!='Q');
if (ch=='C')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
modify_x(1,1,n,x1,x2,y1,y2);
}
else
{
ans=false;
scanf("%d%d",&x1,&y1);
require_x(1,1,n,x1,y1);
printf("%d/n",ans);
}
}
printf(" /n");
}
return 0;
}