# include <iostream>
# include <stdio.h>
using namespace std;
int num[1010],pre[1010];
char s[5];
struct point
{
double x,y;
};
struct Edge
{
point a,b;
}E[1010];
double xmult(point a,point b,point c){//大于零代表a,b,c左转
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool OnSegment(point a,point b,point c){ //a,b,c共线时有效
return c.x>=min(a.x,b.x)&&c.x<=max(a.x,b.x)&&c.y>=min(a.y,b.y)&&c.y<=max(a.y,b.y);
}
bool Cross(point a,point b,point c,point d){//判断ab 与cd是否相交
double d1,d2,d3,d4;
d1=xmult(c,d,a);
d2=xmult(c,d,b);
d3=xmult(a,b,c);
d4=xmult(a,b,d);
if(d1*d2<0&&d3*d4<0) return 1;
else if(d1==0&&OnSegment(c,d,a)) return 1;
else if(d2==0&&OnSegment(c,d,b)) return 1;
else if(d3==0&&OnSegment(a,b,c)) return 1;
else if(d4==0&&OnSegment(a,b,d)) return 1;
return 0;
}
int Find(int x)
{
return x==pre[x]?x:pre[x]=Find(pre[x]);
}
void unin(int i,int j)
{
int x=Find(i);
int y=Find(j);
if(x!=y)
{
pre[y]=x;
num[x]+=num[y];
}
}
int main ()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
pre[i]=i;
num[i]=1;
}
int j=0;
for(i=1;i<=n;i++)
{
int k;
scanf("%s",s);
if(s[0]=='P')
{
j++;
scanf("%lf%lf%lf%lf",&E[j].a.x,&E[j].a.y,&E[j].b.x,&E[j].b.y);
for(k=1;k<j;k++)
{
//printf("%d %d \n",Cross(E[j].a,E[j].b,E[k].a,E[k].b),Find(k)!=Find(j));
if(Find(k)!=Find(j)&&Cross(E[j].a,E[j].b,E[k].a,E[k].b))
{unin(k,j);}
}
}
else if(s[0]=='Q')
{
int temp;
scanf("%d",&temp);
printf("%d\n",num[Find(temp)]);
}
}
if(T) printf("\n");
}
return 0;
}
//详细解法看算法导论