#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int dx[][6] = {{1, 0, -1, -1, -1,  0},
               {1, 1, 0, -1,  0,  1}
};
int dy[][6] = {{0, 1,  1,  0, -1, -1},
              {0, 1, 1,  0, -1, -1}
};
  
typedef struct store{
  int x, y;
}store;

bool range(int x, int y, int mx, int my){
  if((0 <= x and x < mx) and (0 <= y and y < my))return true;
  else return false;
}
  

void computeDist(vector<vector<int> > &field, store st){
  field[st.y][st.x] = 0;
  queue<pair<store, int> > que;
  que.push(pair<store, int>(st, 0));
  while(not que.empty()){
    store s  = que.front().first;
    int dist = que.front().second;
    que.pop();
    for (int i = 0; i < 6; i++) {
      int d = s.y&1;
      if(not range(s.x + dx[d][i], s.y + dy[d][i], field[0].size(), field.size()))continue;
      if(field[dy[d][i] + s.y][dx[d][i] + s.x] > dist + 1){
        field[dy[d][i] + s.y][dx[d][i] + s.x] = dist + 1;
        que.push(pair<store, int>((store){s.x + dx[d][i], s.y + dy[d][i]}, dist + 1));
      }
    }
  }
}
  

int main(){
  int m, n;
  while(std::cin >> m >> n, n){
    int s, t, x, y;
    std::cin >> s;
    vector<store> vs(s, (store){0, 0});
    vector<vector<vector<int> > > field(s, vector<vector<int> >(n, vector<int>(m, 1e9)));
    for (int i = 0; i < s; i++) {
      std::cin >> x >> y;
      vs[i] = (store){--x, --y};
    }
    std::cin >> t;
    vector<store> vp(t);
    for (int i = 0; i < t; i++) {
      std::cin >> x >> y;
      vp[i] = (store){--x, --y};
    }
    for (int i = 0; i < s; i++) computeDist(field[i], vs[i]);
    // for (int i = 0; i < n; i++) {
    //   for (int j = 0; j < m; j++) {
    //     std::cout << field[0][i][j] << " ";
    //   }
    //   std::cout << std::endl;
    // }
    int ans = 0;
    for (int loop = 0; loop < t; loop++) {
      vector<vector<int> > covered(n, vector<int>(m, 1e9));
      computeDist(covered, vp[loop]);
      int val = 0;
      for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
          int mini = covered[i][j], type = -10;
          for (int k = 0; k < s; k++) {
            if(mini >= field[k][i][j]) break;
            if(k == s - 1)val++;
          }
        }
      }
      ans = max(ans, val);
    }
    std::cout << ans << std::endl;
  }
  return 0;
}

