#define _USE_MATH_DEFINES
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<climits>
using namespace std;

const int dy[6] = {-1, -1, 0, 1, 1, 0};
const int dx[2][6] = { {-1, 0, 1, 0, -1, -1}, {0, 1, 1, 1, 0, -1} };

struct Data{
	int y, x;
	bool is_deven;
	Data(){}
	Data(int _y, int _x, bool _is_deven){
		y = _y; x = _x; is_deven = _is_deven;
	}
};

int main(){
	int N, M, S, T, X[10], Y[10], P, Q;
	while(cin >> M >> N, M || N){
		cin >> S;
		for(int i = 0; i < S; i++){
			cin >> X[i] >> Y[i];
			X[i]--; Y[i]--;
		}

		cin >> T;
		int ans = 0;
		for(int i = 0; i < T; i++){
			cin >> P >> Q;
			P--; Q--;

			queue<Data> q;
			Data q_front;
			bool used[100][100] = {};
			int deven_scope = 0;
			
			for(int j = 0; j < S; j++){
				q.push( Data(Y[j], X[j], false) );
			}
			q.push( Data(Q, P, true) );

			while( !q.empty() ){
				q_front = q.front(); q.pop();

				if(used[q_front.y][q_front.x]) continue;
				used[q_front.y][q_front.x] = true;

				if(q_front.is_deven) deven_scope++;
				
				for(int j = 0; j < 6; j++){
					int ny = q_front.y + dy[j];
					int nx = q_front.x + dx[q_front.y&1][j];
					
					if(ny < 0 || N <= ny || nx < 0 || M <= nx) continue;

					q.push( Data(ny, nx, q_front.is_deven) );
				}
			}
			ans = max(ans, deven_scope);
		}
		printf("%d\n", ans);
	}
	return 0;
}