#include <algorithm>
#include <iostream>
#include <set>
#include <vector>

struct punkt {
	int x = 0;
	int y = 0;
	int indeks_w_wierszu = 0;
	int indeks_w_kolumnie = 0;
};

int rozwiaz() {
	int w, h, n;
	std::cin >> w >> h >> n;
	std::vector<punkt> pale(n);
	std::vector<std::vector<int>> pale_wg_wiersza(w);
	std::vector<std::vector<int>> pale_wg_kolumny(h);
	for (int i = 0; i < n; i++) {
		punkt p;
		std::cin >> p.x >> p.y;
		p.x--;
		p.y--;
		p.indeks_w_wierszu = pale_wg_wiersza[p.x].size();
		p.indeks_w_kolumnie = pale_wg_kolumny[p.y].size();
		pale[i] = p;
		pale_wg_wiersza[p.x].push_back(i);
		pale_wg_kolumny[p.y].push_back(i);
	}
	auto is_odd_size = [](const auto& arg) {
		return std::size(arg) % 2 != 0;
	};
	if (std::any_of(pale_wg_wiersza.begin(), pale_wg_wiersza.end(), is_odd_size))
		return 0;
	if (std::any_of(pale_wg_kolumny.begin(), pale_wg_kolumny.end(), is_odd_size))
		return 0;
	int indeks = 0;
	int odwiedzone = 0;
	do {
		indeks = pale_wg_wiersza[pale[indeks].x][pale[indeks].indeks_w_wierszu ^ 1];
		indeks = pale_wg_kolumny[pale[indeks].y][pale[indeks].indeks_w_kolumnie ^ 1];
		odwiedzone += 2;
	} while (indeks != 0);
	if (odwiedzone != n)
		return 0;
	int otwarcie_linii_poziomej = -1;
	std::set<int> otwarcia_linii_pionowych;
	for (const auto& p : pale) {
		if (otwarcie_linii_poziomej < 0) {
			otwarcie_linii_poziomej = p.x;
		} else {
			auto it = otwarcia_linii_pionowych.upper_bound(otwarcie_linii_poziomej);
			if (it != otwarcia_linii_pionowych.end() && *it < p.x)
				return 0;
			otwarcie_linii_poziomej = -1;
		}
		auto it = otwarcia_linii_pionowych.find(p.x);
		if (it != otwarcia_linii_pionowych.end())
			otwarcia_linii_pionowych.erase(it);
		else
			otwarcia_linii_pionowych.insert(it, p.x);
	}
	return 1;
}

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int t;
	std::cin >> t;
	for (int i = 0; i < t; i++) {
		std::cout << rozwiaz() << '\n';
	}
	return 0;
}
