#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> grid;

const int INF = 1e9;
const int dx[6] = {0,1,1,1,0,-1}, dy[6] = {-1,-1,0,1,1,0};
int h,w;

grid bfs(int y, int x){
  grid res(h,vi(w,INF));
  res[y][x] = 0;
  queue<int> q;
  q.push(y*w+x);
  
  while(q.size()){
    y = q.front()/w; x = q.front()%w; q.pop();
    int c = res[y][x];

    for(int i=0;i<6;i++){
      int ny = y+dy[i], nx = x+dx[i] + ((y%2==0 && i%3!=2)?-1:0);
      if(ny<0 || nx<0 || ny>=h || nx>=w)continue;
      if(res[ny][nx]>c+1){
	res[ny][nx] = c+1;
	q.push(ny*w+nx);
      }
    }
  }
  return res;
}

int main(){
  while(cin >> w >> h, w){
    grid g(h,vi(w,INF));

    int s;
    cin >> s;
    for(int z=0;z<s;z++){
      int a,b; cin >> a >> b; a--; b--;
      grid tmp = bfs(b,a);

      for(int i=0;i<h;i++){
	for(int j=0;j<w;j++)g[i][j] = min(g[i][j], tmp[i][j]);
      }
    }

    int t, res = 0;
    cin >> t;
    for(int z=0;z<t;z++){
      int a,b; cin >> a >> b; a--; b--;
      grid tmp = bfs(b,a);
      int cover = 0;
      for(int i=0;i<h;i++){
	for(int j=0;j<w;j++){
	  if(g[i][j] > tmp[i][j])cover++;
	}
      }
      res = max(res, cover);
    }
    
    cout << res << endl;
  }
}