1 #include <iostream>
2 #include <set>
3 #include <cstring>
4 #include <cstdio>
5
6 using namespace std;
7
8 struct point
9 {
10 double x, y;
11 point( double _x = 0, double _y = 0 )
12 {
13 x = _x;
14 y = _y;
15 }
16 point operator-( point t )
17 {
18 return point( x - t.x, y - t.y );
19 }
20 double operator*( point t )
21 {
22 return x * t.y - y * t.x;
23 }
24 };
25
26 //快速排斥试验模板
27 bool quickExclude( point a, point b, point c, point d )
28 {
29 int x1 = a.x, x2 = b.x, x3 = c.x, x4 = d.x;
30 int y1 = a.y, y2 = b.y, y3 = c.y, y4 = d.y;
31 if ( min(x1,x2) <= max(x3,x4) && min(x3,x4) <= max(x1,x2) &&
32 min(y1,y2) <= max(y3,y4) && min(y3,y4) <= max(y1,y2) )
33 return true;
34 else return false;
35 }
36
37 //跨立试验模板(两线段(ab)和(cd)是否相交)
38 bool ifIntersect( point a, point b, point c, point d )
39 {
40 if ( quickExclude( a, b, c, d ) )
41 {
42 if ( ( ( a - c ) * ( c - d ) ) * ( ( b - c ) * ( c - d ) ) <= 0 && ( ( c - a ) * ( a - b ) ) * ( ( d - a ) * ( a - b ) ) <= 0 )
43 return true;
44 }
45 return false;
46 }
47
48 set<int> ss;
49 int father[1010];
50 int num[1010];
51 point arr[1010][2];
52
53 int main()
54 {
55 int T;
56 cin>>T;
57 for(int y=0;y<T;y++)
58 {
59 if(y!=0)
60 cout<<endl;
61 int n;
62 for(int i=1;i<=1000;i++)
63 father[i]=i;
64 for(int i=1;i<=1000;i++)
65 num[i]=1;
66 cin>>n;
67 int time=1;
68 char c;
69 double x1,y1,x2,y2;
70 for(int i=0;i<n;i++)
71 {
72 ss.clear();
73 cin>>c;
74 if(c=='P')
75 {
76 cin>>x1>>y1>>x2>>y2;
77 arr[time][0].x=x1;
78 arr[time][0].y=y1;
79 arr[time][1].x=x2;
80 arr[time][1].y=y2;
81 for(int t=1;t<time;t++)
82 {
83 if(ifIntersect(arr[time][0],arr[time][1],arr[t][0],arr[t][1]))
84 {
85 ss.insert(time);
86 int ft=t;
87 while(ft!=father[ft])
88 {
89 ft=father[ft];
90 }
91 father[ft]=time;
92 if(ss.find(ft)==ss.end())
93 {
94 ss.insert(ft);
95 num[time]=num[time]+num[ft];
96 num[ft]=0;
97 }
98 }
99 }
100 time++;
101 }
102 else if(c=='Q')
103 {
104 int se;
105 cin>>se;
106 int fse=se;
107 while(fse!=father[fse])
108 {
109 fse=father[fse];
110 }
111 int j=se;
112 while(j!=fse)
113 {
114 int tmp=father[j];
115 father[j]=fse;
116 j=tmp;
117 }
118 cout<<num[fse]<<endl;
119 }
120 }
121 }
122 return 0;
123 }