#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int INF = 1<<28; typedef complex cmp_t; struct data_t { cmp_t s , t ; bool isMine ; bool isLocal; data_t(cmp_t ss = cmp_t(), cmp_t tt = cmp_t(), bool f1 = true, bool f2= true) { s=ss;t=tt; isMine = f1 ; isLocal = f2; } }; const double ERROR= 1e-9; cmp_t crossLines(cmp_t o1 , cmp_t l1 , cmp_t o2 , cmp_t l2) { double det = imag(conj(l1)*l2); if(abs(det) > ERROR) { return o1 + l1*imag(conj(o2-o1)*l2)/det; } else throw 0 ; } bool operator < (const cmp_t& p1 , const cmp_t& p2) { if(abs(p1.real()-p2.real())>ERROR) return p1.real() < p2.real(); return p1.imag() < p2.imag() - ERROR; } int main() { int cas ; int xa,ya,xb,yb; cin >> cas; while(cas--) { cin >> xa >> ya >> xb >> yb ; int n; cin >> n; vector dat(n) ; for(int i= 0 ; i < n ; i++) { double x,y;int f1,f2; cin >> x >> y ; cmp_t s(x,y); cin >> x >> y ; cmp_t t(x,y); cin >> f1 >> f2; dat[i] = data_t(s , t , f1 , f2); } vector > crs; cmp_t sa(xa,ya) , sb(xb,yb); for(int i = 0 ; i < n; i++) { cmp_t crossP ; try{ crossP = crossLines(sa , sb-sa , dat[i].s , dat[i].t-dat[i].s); double minX = min(dat[i].s.real() , dat[i].t.real()); double maxX = max(dat[i].s.real() , dat[i].t.real()); double minY = min(dat[i].s.imag() , dat[i].t.imag()); double maxY = max(dat[i].s.imag() , dat[i].t.imag()); double minX2 = min(sa.real() , sb.real()); double maxX2 = max(sa.real() , sb.real()); double minY2 = min(sa.imag() , sb.imag()); double maxY2 = max(sa.imag() , sb.imag()); //cout << crossP << endl; if(minX - ERROR < crossP.real() && crossP.real() < maxX + ERROR && minY - ERROR < crossP.imag() && crossP.imag() < maxY + ERROR && minX2 - ERROR < crossP.real() && crossP.real() < maxX2 + ERROR && minY2 - ERROR < crossP.imag() && crossP.imag() < maxY2 + ERROR) { bool f ; if(dat[i].isMine) f = dat[i].isLocal; else f = !dat[i].isLocal; crs.push_back(make_pair(crossP , f)); //cout << crossP << endl; } }catch(...){ } } sort(crs.begin() , crs.end()); int cnt = 0; for(int i = 1 ; i < (int)crs.size() ; i++) { if(crs[i].second!=crs[i-1].second) cnt++; } cout << cnt << endl; } return 0; }