#include using namespace std; int K, L, R; const int INF = (int) 1e8; struct Snake { int x1, y1, x2, y2; Snake() {} Snake(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) { assert(x1 == x2 || y1 == y2); if (x1 > x2) { swap(x1, x2); swap(y1, y2); } if (y1 > y2) { swap(x1, x2); swap(y1, y2); } } void read() { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); } int isok(int x1) { return x1 >= L && x1 <= R; } int isType2() { if (x1 == x2) { if (x1 < L || x1 > R) { return y2 < L || y1 > R; } } else { if (y1 < L || y1 > R) { return x2 < L || x1 > R; } } return false; } int getType() { if (isType2()) { return 2; } if (x1 == x2) { if (x1 >= L && x1 <= R) { return 0; } return 1; } else { if (y1 >= L && y1 <= R) { return 1; } return 0; } } pair getPair() { assert(getType() != 2); if (getType() == 0) { return make_pair(x1, x2 + 1); } else { return make_pair(y1, y2 + 1); } } void print() { cerr << x1 << " " << y1 << " " << x2 << " " << y2 << endl; } int isIntersectsWithPoison() { if (x1 == x2) { if (x1 < L || x1 > R) { return false; } return !(y2 < L || y1 > R); } else { if (y1 < L || y1 > R) { return false; } return !(x2 < L || x2 > R); } } }; int solve(vector > v, int start, int ed) { /* fprintf(stderr, "start = %d, end = %d\n", start, ed - 1); fprintf(stderr, "the segments are as follows\n"); for (auto it: v) { fprintf(stderr, "%d %d\n", it.first, it.second - 1); } */ sort(v.begin(), v.end()); int cur = start; int ans = 0; for (int i = 0; i < v.size(); ) { int idx = v.size(); int max_y = cur; for (int j = i; j < v.size(); j++) { if (v[j].first <= cur) { max_y = max(max_y, v[j].second); } else { idx = j; break; } } if (max_y >= ed) { ans++; return ans; } if (max_y == cur) { return INF; } else { ans++; cur = max_y; i = idx; } } return INF; } void test() { int n; cin >> n; vector > v; for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; v.push_back(make_pair(x, y)); } cout << solve(v, 2, 6) << endl; } int main() { //freopen ("sample.txt", "r", stdin); /* test(); return 0; */ int T; scanf("%d", &T); assert(T >= 1 && T <= 10); while (T--) { int n, m; scanf("%d %d %d", &n, &K, &m); assert(n >= 1 && n <= (int) 1e9); assert(K >= 1 && K <= (int) n - 2); assert(m >= 1 && m <= (int) 1e5); assert(n % 2 == 1); assert(K % 2 == 1); L = (n - K) / 2 + 1; R = L + K - 1; vector snakes; for (int i = 0; i < m; i++) { Snake s; s.read(); snakes.push_back(s); if (s.isIntersectsWithPoison()) { s.print(); assert(false); //exit(0); } assert(!s.isIntersectsWithPoison()); } vector > segments[2]; vector snakeSegments[2]; for (Snake s: snakes) { if (s.getType() != 2) { segments[s.getType()].push_back(s.getPair()); snakeSegments[s.getType()].push_back(s); } else { //fprintf(stderr, "Type of this snake is 2\n"); //s.print(); } } // increment right coordinates of stuff. R++; int ans = 0; for (int type = 0; type < 2; type++) { int temp = solve(segments[type], L, R); //fprintf(stderr, "answer for type = %d is = %d\n", type, temp); ans += temp; } /* cerr << endl; for (int type = 0; type < 2; type++) { cerr << "type " << type << endl; for (auto it: snakeSegments[type]) { it.print(); } } */ fprintf(stderr, "m is %d\n", m); fprintf(stderr, "Answer is %d\n", ans); printf("%d\n", ans >= INF ? -1 : ans); //cerr << "-------------" << endl << endl; } return 0; }