#include<bits/stdc++.h>
#define rep(i,n)for(int i=0;i<(n);i++)
using namespace std;

struct st { int x, y, c; };
int d[100][100], b[100][100], x[10], y[10];
int dx[][6]{ { 0,-1,0,1,1,1, },{-1,-1,-1,0,1,0} };
int dy[]{ -1,0,1,1,0,-1 };
int main() {
	int m, n, s;
	while (scanf("%d%d", &m, &n), m) {
		scanf("%d", &s);
		rep(i, s)scanf("%d%d", &x[i], &y[i]), x[i]--, y[i]--;
		int t; scanf("%d", &t);
		int Max = 0;
		rep(i, t) {
			int p, q; scanf("%d%d", &p, &q); p--; q--;
			queue<st>que;
			memset(d, -1, sizeof(d));
			rep(j, s) {
				d[x[j]][y[j]] = 0; b[x[j]][y[j]] = j;
				que.push({ x[j],y[j],j });
			}
			d[p][q] = 0; b[p][q] = s; que.push({ p,q,s });
			while (!que.empty()) {
				st p = que.front(); que.pop();
				rep(j, 6) {
					int nx = p.x + dx[!(p.y & 1)][j], ny = p.y + dy[j];
					if (0 <= nx&&nx < m && 0 <= ny&&ny < n) {
						if (d[nx][ny] == -1) {
							d[nx][ny] = d[p.x][p.y] + 1;
							b[nx][ny] = p.c;
							que.push({ nx,ny,p.c });
						}
						else if (d[nx][ny] == d[p.x][p.y] + 1) {
							b[nx][ny] = -1;
							que.push({ nx,ny,p.c });
						}
					}
				}
			}
			int cnt = 0;
			rep(i, m)rep(j, n) {
				if (b[i][j] == s)cnt++;
			}
			Max = max(Max, cnt);
		}
		printf("%d\n", Max);
	}
}