#include
using namespace std;
const int maxn=1010;
int n,m,ans,tree[maxn<<2][maxn<<2];
void update_y(int q1,int q2,int yl,int yr,int xt,int yt){//传入Y维要更新区间Q1,Q2,搜索区间1~N,当前X维结点,Y维初始结点1
if(q1<=yl&&yr<=q2){//更新区间包括了当前搜索空间就直接更新
tree[xt][yt]++;//该值累加,如果每次操作加的值会变就要再传一个VAL值
return ;
}
int ymid=(yl+yr)>>1;//如果当前区间不合适,继续二分
if(q1<=ymid)update_y(q1,q2,yl,ymid,xt,yt<<1);//要更新区间在MID左边有值就更新左儿子
if(q2>ymid)update_y(q1,q2,ymid+1,yr,xt,yt<<1|1);//要更新区间在MID右边有值就更新右儿子
}
void update_x(int p1,int q1,int p2,int q2,int xl,int xr,int xt){//传入参数:两点坐标,当前X维搜索到的区间,当前结点
if(p1<=xl&&xr<=p2){//两点坐标X维包括了当前搜索空间就往进入Y维更新
update_y(q1,q2,1,n,xt,1);//传入Y维要更新区间Q1,Q2,搜索区间1~N,当前X维结点,Y维初始结点1
return ;
}
int xmid=(xl+xr)>>1;//如果当前区间不合适,继续二分
if(p1<=xmid)update_x(p1,q1,p2,q2,xl,xmid,xt<<1);//要更新区间在MID左边有值就更新左儿子
if(p2>xmid)update_x(p1,q1,p2,q2,xmid+1,xr,xt<<1|1);//要更新区间在MID右边有值就更新右儿子
}
void query_y(int y,int yl,int yr,int xt,int yt){//传参:查询Y坐标,Y维区间,X维结点编号,Y维结点编号
ans=ans+tree[xt][yt];//将每个值都加上防止遗漏
if(yl==yr) return ;//叶子结点跳出
int ymid=(yl+yr)>>1;//二分
if(y<=ymid)query_y(y,yl,ymid,xt,yt<<1);//要查询区间在MID左边有值就查询左儿子
if(y>ymid)query_y(y,ymid+1,yr,xt,yt<<1|1);//要更新区间在MID右边有值就更新右儿子
}
void query_x(int x,int y,int xl,int xr,int xt){//传参:查询坐标,X维区间,结点编号
query_y(y,1,n,xt,1);//传参:查询Y坐标,Y维区间,X维结点编号,Y维结点编号
if(xl==xr) return ;//叶子结点跳出
int xmid=(xl+xr)>>1;//二分
if(x<=xmid)query_x(x,y,xl,xmid,xt<<1);//要查询区间在MID左边有值就查询左儿子
if(x>xmid)query_x(x,y,xmid+1,xr,xt<<1|1);//要更新区间在MID右边有值就更新右儿子
}
int main(){
int QAQ;scanf("%d",&QAQ);//QAQ个样例
while(QAQ--){
memset(tree,0,sizeof(tree));//记得初始化
scanf("%d%d",&n,&m);//输入行列数,操作数
char q;int p1,q1,p2,q2;
for(int i=0;i