1 #include <cstdio>
2 #include <iostream>
3 #include <string.h>
4 using namespace std;
5
6 const double EPS = 1e-10;
7 #define MAX 1001
8
9 struct point //点
10 {
11 double x,y;
12 };
13
14 struct line //线
15 {
16 point a,b;
17 }l[MAX];
18
19 int father[MAX],num[MAX];
20 double Max(double a,double b) {return a>b?a:b;}
21 double Min(double a,double b) {return a>b?b:a;}
22
23 // 判断两线段是否相交(非规范相交)
24 bool inter(line l1,line l2)
25 {
26 point p1,p2,p3,p4;
27 p1=l1.a;p2=l1.b;
28 p3=l2.a;p4=l2.b;
29
30 if( Min(p1.x,p2.x)>Max(p3.x,p4.x) ||
31 Min(p1.y,p2.y)>Max(p3.y,p4.y) ||
32 Min(p3.x,p4.x)>Max(p1.x,p2.x) ||
33 Min(p3.y,p4.y)>Max(p1.y,p2.y) )
34 return 0; //直接没有相交
35 double k1,k2,k3,k4;
36 k1 = (p2.x-p1.x)*(p3.y-p1.y) - (p2.y-p1.y)*(p3.x-p1.x);
37 k2 = (p2.x-p1.x)*(p4.y-p1.y) - (p2.y-p1.y)*(p4.x-p1.x);
38 k3 = (p4.x-p3.x)*(p1.y-p3.y) - (p4.y-p3.y)*(p1.x-p3.x);
39 k4 = (p4.x-p3.x)*(p2.y-p3.y) - (p4.y-p3.y)*(p2.x-p3.x);
40 return (k1*k2<=EPS && k3*k4<=EPS);
41 }
42
43 //初始化函数
44 void Init(int n)
45 {
46 int i;
47 for(i=1;i<=n;i++)
48 {
49 father[i]=i;
50 num[i]=1;
51 }
52 }
53
54 int Find(int x)
55 {
56 while(father[x]!=x)
57 x=father[x];
58 return x;
59 }
60
61 void combine(int a,int b)
62 {
63 int temp_a,temp_b;
64 temp_a=Find(a);
65 temp_b=Find(b);
66
67 // 在合并集合的时候,相应集合所含的个数也要合并
68 if(temp_a!=temp_b)
69 {
70 father[temp_a]=temp_b;
71 num[temp_b]+=num[temp_a];
72 }
73 }
74
75 int main()
76 {
77 int test,i,n,k,js;
78 char c;
79 cin>>test;
80 while(test--)
81 {
82 js=0;
83 cin>>n;
84 Init(n);
85 while(n--)
86 {
87 cin>>c;
88 // 判断是P还是Q
89 if(c=='P')
90 {
91 ++js;
92 cin>>l[js].a.x>>l[js].a.y>>l[js].b.x>>l[js].b.y;
93
94 // 判断该线段与之前线段是否相交,相交则合并
95 for(i=1;i<js;++i)
96 {
97 if( inter(l[js],l[i]) )
98 combine(js,i);
99 }
100 }
101 else
102 {
103 cin>>k;
104 cout<<num[Find(k)]<<endl;
105 }
106 }
107 // 格式!!!很重要,最后一组测试数据后无空行
108 if(test) cout<<endl;
109 }
110 return 0;
111 }