#include #include #include #include using namespace std; typedef complex Point; const double delta = 1e-10; struct Line{ Point base, w; Line(const Point & p, const Point & q): base(p), w((q - p) / abs(q - p)){} }; struct Parallel{}; Point intersectionOf(const Line & p, const Line &q){ Point base = (q.base - p.base) * conj(p.w); Point w = q.w * conj(p.w); if(abs(w.imag()) < delta){throw Parallel();} double r = -base.imag() / w.imag(); Point intersection = base + w * r; return intersection * p.w + p.base; } struct State{ Point p; bool isHigh; State(const Point & p_, bool isHigh_): p(p_), isHigh(isHigh_){} bool operator < (const State & s) const { if(abs(s.p.real() - p.real()) >= delta){ return p.real() < s.p.real(); } return p.imag() < s.p.imag(); } }; bool LEQ(double p, double q){ return p < q or abs(p - q) < delta; } bool isIn(double p, double q, double r){ return LEQ(q, p) and LEQ(p, r) or LEQ(r, p) and LEQ(p, q); } //p is in (q, r) bool isIn(Point p, Point q, Point r){ return isIn(p.real(), q.real(), r.real()) and isIn(p.imag(), q.imag(), r.imag()); } int main(){ int Case; std::cin >> Case; while(Case--){ int xa, ya, xb, yb; std::cin >> xa >> ya >> xb >> yb; Point a(xa, ya), b(xb, yb); Line l(a, b); int m; std::cin >> m; std::set intersections; for(int i = 0; i < m; i++){ int xa, ya, xb, yb; std::cin >> xa >> ya >> xb >> yb; Line l_(Point(xa, ya), Point(xb, yb)); int p, q; std::cin >> p >> q; bool high = (p == q); try{ Point intersection = intersectionOf(l, l_); if(isIn(intersection, Point(xa, ya), Point(xb, yb)) and isIn(intersection, a, b)){ intersections.insert(State(intersection, high)); } }catch(...){ } } if(intersections.empty()){std::cout << "0" << std::endl; continue;} bool high = intersections.begin()->isHigh; int count = 0; while(!intersections.empty()){ bool h = intersections.begin()->isHigh; intersections.erase(intersections.begin()); if(high != h){count++;} high = h; } std::cout << count << std::endl; } }