#include <bits/stdc++.h>
using namespace std;

#define for_(i,a,b) for(int i=(a);i<(b);++i)

struct Point {
	int x, y, s;
	Point(int x_, int y_, int s_) : x(x_), y(y_), s(s_) {}
};

int dx[2][6] = {
		{1, 1, 1, 0, -1, 0}, 
		{0, 1, 0, -1, -1, -1}
	},
	dy[6] = {-1, 0, 1, 1, 0, -1},
	W, H, S, T;

bool vis[110][110], grid[110][110];

vector< Point > search(int sx, int sy) {
	memset(vis, 0, sizeof(vis));
	
	queue< Point > que;
	que.push(Point(sx, sy, 0));
	vis[sy][sx] = 1;
	
	vector< Point > res;
	int mns = int(1e9);
	
	while (!que.empty()) {
		Point p = que.front(); que.pop();
		
		if (mns < p.s) break;
		
		if (grid[p.y][p.x]) {
			mns = p.s;
			res.push_back(p);
			continue;
		}
		
		for_(d,0,6) {
			int nx = p.x + dx[p.y % 2][d], ny = p.y + dy[d];
			if (nx <= 0 || W < nx || ny <= 0 || H < ny) continue;
			if (vis[ny][nx]) continue;
			vis[ny][nx] = 1;
			que.push(Point(nx, ny, p.s + 1));
		}
	}
	
	return res;
}

int main() {	
	while (cin >> W >> H, W) {
		memset(grid, 0, sizeof(grid));
		
		cin >> S;		
		for_(i,0,S) {
			int x, y;
			cin >> x >> y;
			grid[y][x] = 1;
		}
		
		int ans = 0;
		
		cin >> T;
		for_(i,0,T) {
			int x, y;
			cin >> x >> y;
			grid[y][x] = 1;
			
			int cnt = 0;
			for_(yy,1,H+1) for_(xx,1,W+1) {
				vector< Point > vp = search(xx, yy);
				if (vp.size() > 1) continue;				
				if (vp[0].x == x && vp[0].y == y) ++cnt;
			}
			
			grid[y][x] = 0;
			ans = max(ans, cnt);
		}
		
		cout << ans << endl;
	}
}