// Original C++ solution (slower):
#include <iostream>

#include <queue>

using namespace std;

#define rep(i,n) for(int i=0;i<n;i++)

typedef pair<pair<int,int>,int> NODE;

#define X first.second

#define Y first.first

#define depth second



/*ï*/

int ox[] = {-1, 1, 0, 0, 1,1};

int oy[] = { 0, 0,-1, 1,-1,1};



/*ô*/

int ex[] = {-1, 1, 0, 0,-1,-1};

int ey[] = { 0, 0,-1, 1,-1, 1};



int main(){

	int point[100][100];

	int h,w,a,b,t,x,y,s;

	while(cin >> w  && w){

		int ret = 0;

		cin >> h;

		rep(i,100)rep(j,100)point[i][j] = 0;

		cin >> t;

		rep(i,t){

			cin >> a >> b;

			a--;b--;

			point[b][a] = i+1;

		}

		cin >> s;

		rep(P,s){

			cin >> a >> b;

			a--;b--;

			point[b][a] = 50;

			

		//rep(i,h){rep(j,w)cout << point[i][j];cout << endl;}

		int pt[100] = {0};

		rep(i,h)rep(j,w){

			x = j,y = i;

			queue<NODE> Q;

			pair<int,int> dp[100];

			bool done[100][100]={0};

			Q.push( make_pair(make_pair(y,x),0	) );

			while( Q.size() ){

				NODE q = Q.front(); Q.pop();

				if(point[q.Y][q.X]){

					dp[q.depth].first++;

					dp[q.depth].second = point[q.Y][q.X];

			  }

				if( q.Y % 2 == 1){

					rep(L,6){

						if( q.X+ox[L] >=0 && q.X+ox[L] < w && q.Y+oy[L] < h && q.Y+oy[L]>=0 ){

								if( !done[q.Y+oy[L]][q.X+ox[L]] )Q.push( make_pair(make_pair(q.Y+oy[L],q.X+ox[L]),q.depth+1) );

							  	done[q.Y+oy[L]][q.X+ox[L]] = true;

						}

					}

				}else{

					rep(L,6){

						if( q.X+ex[L] >=0 && q.X+ex[L] < w && q.Y+ey[L] < h && q.Y+ey[L]>=0 ){

									if( !done[q.Y+ey[L]][q.X+ex[L]] )Q.push( make_pair(make_pair(q.Y+ey[L],q.X+ex[L]),q.depth+1) );

							  	done[q.Y+ey[L]][q.X+ex[L]] = true;

						}

					}

				}

			}

			rep(I,100){

				if(dp[I].first){

					if(dp[I].first==1)

						pt[dp[I].second-1]++;

					break;

				}

			}

		}

			ret = max(pt[49],ret);

			point[b][a] = 0;

		}

		cout << ret << endl;

	}

	

}

// Optimized solution to the same problem (faster):
#include <iostream>

#include <vector>

#include <cstdio>

#include <queue>

using namespace std;



struct NODE{

	int x,y,c,num;

	NODE(int x,int y,int c) : x(x) , y(y) , c(c) {}

	NODE(int x,int y,int c,int num) : x(x) , y(y) , c(c) , num(num) {}

};

int W,H;



int doit(vector<NODE> v){

	queue<NODE> Q;

	for(int i = 0 ; i < v.size() ; i++){

		Q.push(NODE(v[i].x,v[i].y,0,i));

	}

	int cnt[100][100]={};

	int ans[100][100];

	for(int i = 0 ; i < 100 ; i++)

		for(int j = 0 ; j < 100 ; j++)

			ans[i][j] = 1e9;

	

	// kore Shindoinen!!!!!!!!!!!!!

	// kore Shindoinen!!!!!!!!!!!!!

	// kore Shindoinen!!!!!!!!!!!!!

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

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

	// kore Shindoinen!!!!!!!!!!!!!

	// kore Shindoinen!!!!!!!!!!!!!

	// kore Shindoinen!!!!!!!!!!!!!

	while(Q.size()){

		NODE q = Q.front(); Q.pop();

		if( q.x < 0 || q.y < 0 || q.x >= W || q.y >= H ) continue;

		if( ans[q.y][q.x] < q.c ) continue;

		if( ans[q.y][q.x] > 10000) {

			ans[q.y][q.x] = q.c;

			cnt[q.y][q.x] = (1<<q.num);

		}else if( ans[q.y][q.x] == q.c ){

			cnt[q.y][q.x] |= (1<<q.num);

			continue;

		}

		for(int i = 0 ; i < 6 ; i++){

			Q.push(NODE(q.x+dx[q.y%2][i],q.y+dy[q.y%2][i],q.c+1,q.num));

		}

	}

	

	int cntt = 0;

	for(int i = 0 ; i < H ; i++){

		for(int j = 0 ; j < W ; j++){

			//printf("%3d",cnt[i][j]);

			if( cnt[i][j] == (1<<(v.size()-1)) ){

				cntt++;

			}

		}

		//puts("");

	}

	return cntt;

	

}

int main(){



	while(cin >> W >> H && W){

		int s,N;

		cin >> s;

		vector<NODE> alr;

		for(int i = 0 ; i < s ; i++){

			int x,y;

			cin >> x >> y;

			x--,y--;

			alr.push_back(NODE(x,y,0));

		}

		cin >> N;

		int ans = 0;

		for(int i = 0 ; i < N ; i++){

			int x,y;

			cin >> x >> y;

			x--,y--;

			alr.push_back(NODE(x,y,0));

			ans = max( ans , doit(alr) );

			alr.pop_back();

		}

		

		cout << ans << endl;

		

		

	}

}

// Fastest known solution for this problem: