#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<iostream>
#include<cmath>
#include<map>
#include<set>
#include<climits>
using namespace std;
typedef vector<string>vs;
typedef vector<int>vi;
typedef vector<vi>vvi;
typedef vector<double>vd;
typedef pair<int,int>pii;
typedef long long ll;
typedef pair<ll,ll>pll;
typedef vector<ll>vl;
typedef pair<int,pii>piii;
#define rrep(i,x,n) for(int i=(x);i<(n);++i)
#define rep(i,x) rrep(i,0,(x))
#define fi first
#define se second
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();++i)
#define all(c) (c).begin(),(c).end()
#define rall(c) (c).rbegin(),(c).rend()
#define pb push_back
#define maxs(a,b) (a)=max(a,b)
#define mins(a,b) (a)=min(a,b)
///#include<sstream>
///#include<cstring>
///#include<stack>
///#include<complex>

const int dy[6]={-1,-1,0,0,1,1};
const int dx[][6]={{-1,0,-1,1,-1,0},{0,1,-1,1,0,1}};
const int INF=1e9;
int W,H;
int s,t;
int x[10],y[10];
int p[10],q[10];
int nearest[10000];
vector<int>G[10000];
void getNearest(){
    fill_n(nearest,H*W,INF);
    queue<int>Q;
    rep(i,s){
        Q.push(y[i]*W+x[i]);
        nearest[y[i]*W+x[i]]=0;
    }

    while(!Q.empty()){
        int pos=Q.front();Q.pop();
        rep(i,G[pos].size()){
            int to=G[pos][i];
            if(nearest[to]!=INF)continue;
            nearest[to]=nearest[pos]+1;
            Q.push(to);
        }
    }
}


int solve(int start){
    int dist[10000];
    queue<int>Q;
    Q.push(q[start]*W+p[start]);
    fill_n(dist,H*W,INF);
    dist[q[start]*W+p[start]]=0;
    int ret=0;
    while(!Q.empty()){
        int pos=Q.front();Q.pop();
        rep(i,G[pos].size()){
            int to=G[pos][i];
            if(dist[to]!=INF)continue;
            dist[to]=dist[pos]+1;
            Q.push(to);
        }
    }

    rep(i,H*W)if(nearest[i]>dist[i])ret++;


    return ret;
}
int main(){
    while(scanf("%d%d",&W,&H),W||H){
        scanf("%d",&s);
        rep(i,s){
            scanf("%d%d",&x[i],&y[i]);
            x[i]--;y[i]--;
        }
        scanf("%d",&t);
        rep(i,t){
            scanf("%d%d",&p[i],&q[i]);
            p[i]--;q[i]--;
        }

        rep(i,H)rep(j,W){
            rep(k,6){
                int ty=i+dy[k],tx=j+dx[i&1][k];
                if(ty<0||ty>=H||tx<0||tx>=W)continue;
                G[i*W+j].pb(ty*W+tx);
            }
        }
        getNearest();

        int ma=0;

        rep(i,t)ma=max(ma,solve(i));

        printf("%d\n",ma);
    }
    return 0;
}