#include<iostream>
#include<cstring>

using namespace std;

#define LEN 100
#define MAX 255
unsigned char map[LEN+2][LEN+2];
unsigned char chk[LEN+2][LEN+2];
unsigned char dis[LEN+2][LEN+2];
bool now[LEN][LEN];

int m,n;

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

void fill( int y, int x, int d, int p ) {

	if ( y < 0 || y > n || x < 0 || x > m )
		return;

	if ( chk[y][x] == MAX ) {
		if ( dis[y][x] > d ) {
			chk[y][x] = p;
			dis[y][x] = d;
		} 
	}
	else {
		if ( chk[y][x] == 0 ) {
			//			cout << "Start" << y << "\t" <<  x << endl;
			chk[y][x] = p;
			dis[y][x] = d;
			for ( int i=0; i<6; i++ ) {
				if ( y%2 == 1 ) {
					fill( y+dy[i], x+edx[i], d+1, p );
				} else
					fill( y+dy[i], x+odx[i], d+1, p );
			}
		} else if ( chk[y][x] == p ) {
			if ( dis[y][x] > d ) {
				dis[y][x] = d;
				for ( int i=0; i<6; i++ ) {
					if ( y%2 == 1 ) {
						fill( y+dy[i], x+edx[i], d+1, p );
					} else
						fill( y+dy[i], x+odx[i], d+1, p );
				}

			}
		} else {
			if ( dis[y][x] > d ) {
				//				cout << "Do" << y << "\t" <<  x << endl;
				chk[y][x] = p;
				dis[y][x] = d;
				for ( int i=0; i<6; i++ ) {
					if ( y%2 == 1 ) {
					fill( y+dy[i], x+edx[i], d+1, p );
					} else
						fill( y+dy[i], x+odx[i], d+1, p );
				}
				
			} else if ( dis[y][x] == d ) {
				//				cout << "Here " << y << "\t" << x << endl;
				chk[y][x] = MAX;
			}
		}
	}
}

int count = 0;

void find ( int y, int x, int d ) {

	if ( y < 0 || y > n || x < 0 || x > m )
		return;

	//	cout << "Do" << y << "\t" <<  x << endl;

	if ( now[y][x] ) {
		now[y][x] = false;
		//		cout << "Get\n";
		if ( dis[y][x] > d ) {
			count++;

			for ( int i=0; i<6; i++ ) {
				if ( y%2 == 1 )
					find( y+dy[i], x+edx[i], d+1 );
				else
					find( y+dy[i], x+odx[i], d+1 );
			}

		}
	}
}
	

int counting ( int y, int x ) {
	//	cout << "Start\n" << endl;
	count = 1;
	now[y][x] = false;

	memset ( now, true, (LEN*LEN)*sizeof(bool));

	find( y, x, 0 );

	return count;
}

int main () {

	while ( true ) {

		cin >> m >> n ;
		if ( m == 0 ) 
			break;
		int s;
		cin >> s;
		int xs, ys;

		for ( int i=0; i<n+2; i++ ) {
			for ( int j=0; j<m+2; j++ ) {
				map[i][j] = 0;
				dis[i][j] = MAX;
				chk[i][j] = 0;
			}
		}

		for ( int i=0; i<s; i++ ) {
			cin >> xs >> ys;
			map[ys-1][xs-1] = i+1;
			chk[ys-1][xs-1] = 0;
			fill ( ys-1, xs-1, 0, i+1);
		}


		/*
		for ( int i=0; i<n; i++ ) {
			for ( int j=0; j<m; j++ ) {
				cout << (char)(map[i][j] + '0');
			}
			cout << endl;
		}
		cout << endl;
		for ( int i=0; i<n; i++ ) {
			for ( int j=0; j<m; j++ ) {
				cout << (int)dis[i][j] << '\t';
			}
			cout << endl;
		}
		cout << endl;
		for ( int i=0; i<n; i++ ) {
			for ( int j=0; j<m; j++ ) {
				cout << (char)(chk[i][j] + '0');
			}
			cout << endl;
		}
		cout << endl;
		*/
		/*
		for ( int i=0 ; i<n+2; i++ ) {
			for ( int j=0; j<m+2; j++ ) {
				if ( map[i][j] > 0 ) {
					fill ( i, j);
				}
			}
		}
		*/
		int t;
		cin >> t;
		int max = 0;
		int pt, qt;
		for ( int i=0; i<t; i++ ) {
			cin >> pt >> qt;
			int temp;
			temp =  counting ( qt-1, pt-1 );

			//			cout << "Cont : " << temp << endl;
			if ( max < temp ) {
				max = temp;
			}
		}
		//		cout << "Ans: "<< max << endl;
		cout << max << endl;
			
	}
}
			