#include <iostream>
#include <queue>
#include <cstring>
using namespace std;

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

#define REP(i,n,m) for(int i=n;i<m;i++)
#define rep(i,n) REP(i,0,n)
#define INF 999999999

int w,h,s,t;
int f[102][102]; //eXÌèÌóµ
int d[102][102]; //e}X©çêÔß¢XÖÌÅ¬£
bool closed[102][102]; //Dæp

int dx1[] = { 0, 1, 1, 1, 0,-1}; //ïñ©çÌJÚ
int dy1[] = {-1,-1, 0, 1, 1, 0}; //ïñ
int dx2[] = {-1, 0, 1, 0,-1,-1}; //ôñ
int dy2[] = {-1,-1, 0, 1, 1, 0}; //ôñ

//flg : }bvðhé©hçÈ¢©
int draw(int x,int y,int id,bool flg){
	int res = 0;
	queue<PP> q;
	memset(closed,0,sizeof(closed));

	q.push(PP(P(x,y),0));

	while(!q.empty()){
		PP p = q.front(); q.pop();
		int x = p.first.first;
		int y = p.first.second;
		if(closed[y][x]) continue;
		closed[y][x] = true;

		if(d[y][x] == p.second && flg){
			f[y][x] = INF;
		}
		else if(d[y][x] > p.second){
			if(flg){
				f[y][x] = id;
				d[y][x] = p.second;
			}
			res++;
		}

		for(int i=0;i<6;i++){
			int nx = x + (y%2==1 ? dx1[i] : dx2[i]);
			int ny = y + (y%2==1 ? dy1[i] : dy2[i]);
			if(nx>=0 && nx<w && ny>=0 && ny<h){
				q.push(PP(P(nx,ny),p.second+1));
			}
		}
	}
	return res;
}

int main(void){
	while(cin>>w>>h,w){
		rep(i,h) rep(j,w) f[i][j] = d[i][j] = INF;

		//àÆ©ç éXÌèÌóµð}bvÉ«Þ
		cin>>s;
		rep(i,s){
			int p,q;
			cin>>p>>q;
			draw(p-1,q-1,i,true);
		}

		//eóânÉu¢½Æ«ÌóµðÀÛÉV~[g
		int ans = 0;
		cin>>t;
		rep(i,t){
			int p,q;
			cin>>p>>q;
			ans = max(ans,draw(p-1,q-1,i,false));
		}

		cout<<ans<<endl;
	}

	return 0;
}