#include<iostream>
#include<queue>
#include<algorithm>

using namespace std;

typedef pair<int, int> P;
typedef pair<int, P> PP;

int m, n, s, t;//?¨????????????¢?¨??????????????????°?¨?????????°
int dis[100][100];//???????¨?
const int vx1[6] = { -1,-1,0,1,0,-1 };//?????????????\???°??¨???????????¶??°??¨
const int vx2[6] = { -1,0,1,1,1,0 };//??????????????¶??°??¨??????????\???°??¨
const int vy[6] = { 0,-1,-1,0,1,1 };
P store[10], plan[10];

void bfs() {
	queue<PP> q;//???????????????y??§?¨????x??§?¨?
	for (int i = 0; i < s; i++) {
		q.push(make_pair(0, make_pair(store[i].first, store[i].second)));
		dis[store[i].first][store[i].second] = -1;//?????§???????????¨?????????-1??¨??????
	}
	while (q.size()) {
		int ct = q.front().first;
		P tmp = q.front().second;
		q.pop();
		for (int i = 0; i < 6; i++) {
			int fy = tmp.first, fx = tmp.second;
			if (fy % 2)fx += vx2[i];
			else fx += vx1[i];
			fy += vy[i];
			if (fy < 0 || fy >= n || fx < 0 || fx >= m)continue;
			if (dis[fy][fx] == 0) {
				dis[fy][fx] = ct + 1;
				q.push(make_pair(ct + 1, make_pair(fy, fx)));
			}
		}
	}
}

int bfs2(int a) {
	int ans = 1;
	queue<PP> q;
	q.push(make_pair(0, plan[a]));
	bool islook[100][100] = {};
	bool f = false;
	for (int i = 0; i < s; i++) {
		if (plan[a] == store[i])f = true;
	}
	if (f)return 0;
	islook[q.front().second.first][q.front().second.second] = true;
	while (q.size()) {
		P tmp = q.front().second;
		int ct = q.front().first;
		q.pop();
		for (int i = 0; i < 6; i++) {
			int fy = tmp.first, fx = tmp.second;
			if (fy % 2)fx += vx2[i];
			else fx += vx1[i];
			fy += vy[i];
			if (fy < 0 || fy >= n || fx < 0 || fx >= m)continue;
			if (!islook[fy][fx] && dis[fy][fx] - ct > 1) {
				ans++;
				dis[fy][fx] = true;
				q.push(make_pair(ct + 1, make_pair(fy, fx)));
			}
		}
	}
	return ans;
}

int main() {
	while (cin >> m >> n, m * n) {
		cin >> s;
		for (int i = 0; i < s; i++) {
			cin >> store[i].second >> store[i].first;
			store[i].first--, store[i].second--;
		}
		cin >> t;
		for (int i = 0; i < t; i++) {
			cin >> plan[i].second >> plan[i].first;
			plan[i].first--, plan[i].second--;
		}
		bfs();//?????????????????????????????¢?????¬???
		int ans = 0;
		for (int i = 0; i < t; i++) {
			ans = max(bfs2(i), ans);//??¨????£???°?????????
		}
		cout << ans << endl;
		for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)dis[i][j] = 0;
	}
	return 0;
}