#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <tuple>
#include <bitset>
#include <memory>
#include <cmath>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <numeric>
#include <climits>
#include <cfloat>
#include <cassert>

struct HexCoordinate {
	int x, y;
	std::vector<HexCoordinate> neighbors() const {
		if (y % 2 == 0) {
			return { {x - 1, y}, {x + 1, y}, {x, y - 1}, {x + 1, y - 1}, {x, y + 1}, {x + 1, y + 1} };
		}
		else {
			return { {x - 1, y}, {x + 1, y}, {x - 1, y - 1}, {x, y - 1}, {x - 1, y + 1}, {x, y + 1} };
		}
	}
};
int main() {
	while (true) {
		int m, n; std::cin >> m >> n; if (n == 0 && m == 0) break;
		int s; std::cin >> s;
		std::vector<std::vector<int>> min_distance(n, std::vector<int>(m, INT_MAX));
		for (auto i = 0; i < s; ++i) {
			int x, y; std::cin >> x >> y;
			std::queue<HexCoordinate> queue; queue.push(HexCoordinate{ x, y });
			min_distance[y - 1][x - 1] = 0;
			while (!queue.empty()) {
				const auto top = queue.front(); queue.pop();
				for (const auto next : top.neighbors()) if (1 <= next.x && next.x <= m && 1 <= next.y && next.y <= n) {
					if (min_distance[next.y - 1][next.x - 1] > min_distance[top.y - 1][top.x - 1] + 1) {
						min_distance[next.y - 1][next.x - 1] = min_distance[top.y - 1][top.x - 1] + 1;
						queue.push(next);
					}
				}
			}
		}
		int t; std::cin >> t;
		int max_count = 0;
		for (auto i = 0; i < t; ++i) {
			int x, y; std::cin >> x >> y;
			auto min = min_distance;
			int count = 1;
			std::queue<HexCoordinate> queue; queue.push(HexCoordinate{ x, y });
			min[y - 1][x - 1] = 0;
			while (!queue.empty()) {
				const auto top = queue.front(); queue.pop();
				for (const auto next : top.neighbors()) if (1 <= next.x && next.x <= m && 1 <= next.y && next.y <= n) {
					if (min[next.y - 1][next.x - 1] > min[top.y - 1][top.x - 1] + 1) {
						min[next.y - 1][next.x - 1] = min[top.y - 1][top.x - 1] + 1;
						queue.push(next);
						++count;
					}
				}
			}
			max_count = std::max(max_count, count);
		}
		std::cout << max_count << '\n';
	}
}

