Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	)

var scanner = bufio.NewScanner(os.Stdin)

const INF = 0x7FFFFFFF

var (
	direction1 = [][]int{ // 奇数段目の移動方向
		{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {1, -1}, {1, 1},
	}
	direction2 = [][]int{ // 偶数段目の移動方向
		{-1, -1}, {0, -1}, {1, 0}, {0, 1}, {-1, 1}, {-1, 0},
	}
)

func main() {
	for scanner.Scan() {
		buf := strings.Split(scanner.Text(), " ")
		m, _ := strconv.Atoi(buf[0])
		n, _ := strconv.Atoi(buf[1])
		if m == 0 && n == 0 {
			break
		}
		// initialize district_map
		/*
			district_map = [
				[-1, -1,  -1,  -1,  -1]
				[-1, INF, INF, INF, -1]
				[-1, INF, INF, INF, -1]
				[-1, INF, INF, INF, -1]
				[-1, INF, INF, INF, -1]
				[-1, -1,  -1,  -1,  -1]
			]
		*/
		district_map := make([][]int, n+2)
		for i := range district_map {
			district_map[i] = make([]int, m+2)
		}
		tmp1 := make([]int, m+2)
		for i := range tmp1 {
			tmp1[i] = -1
		}
		district_map[0] = tmp1
		district_map[n+1] = tmp1
		for i := 1; i < n+1; i++ {
			district_map[i] = make([]int, m+2)
			district_map[i][0] = -1
			district_map[i][m+1] = -1
			for j := 1; j < m+1; j++ {
				district_map[i][j] = INF
			}
		}

		scanner.Scan()
		s, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < s; i++ {
			scanner.Scan()
			buf_ := strings.Split(scanner.Text(), " ")
			x, _ := strconv.Atoi(buf_[0])
			y, _ := strconv.Atoi(buf_[1])
			Search(Point{x, y}, district_map, m, n)
		}
		ans := 0
		scanner.Scan()
		t, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < t; i++ {
			scanner.Scan()
			buf__ := strings.Split(scanner.Text(), " ")
			x, _ := strconv.Atoi(buf__[0])
			y, _ := strconv.Atoi(buf__[1])
			z := Count(Point{x, y}, district_map, m, n)
			ans = max(ans, z)
		}
		fmt.Println(ans)
	}
}

func max(a, b int) int {
	if a < b {
		return b
	}
	return a
}

type Point struct {
	x, y int
}

type Entry struct {
	hop   int
	point Point
}

func Search(p Point, mp [][]int, m, n int) {
	que := make([]Entry, 0)
	que = append(que, Entry{0, p})
	check := make([][]bool, n+2)
	for i := range check {
		check[i] = make([]bool, m+2)
	}
	check[p.y][p.x] = true
	mp[p.y][p.x] = 0
	var direction [][]int
	for len(que) > 0 {
		tmp := que[0]
		que = que[1:]
		dist, point := tmp.hop, tmp.point
		if point.y%2 == 0 {
			direction = direction1
		} else {
			direction = direction2
		}
		for _, d := range direction {
			nx, ny := point.x+d[0], point.y+d[1]
			if !check[ny][nx] && mp[ny][nx] != -1 {
				check[ny][nx] = true
				if mp[ny][nx] > dist+1 {
					mp[ny][nx] = dist + 1
				}
				que = append(que, Entry{dist + 1, Point{nx, ny}})
			}
		}
	}
}

func Count(p Point, mp [][]int, m, n int) int {
	que := make([]Entry, 0)
	que = append(que, Entry{0, p})
	check := make([][]bool, n+2)
	for i := range check {
		check[i] = make([]bool, m+2)
	}
	check[p.y][p.x] = true
	ans := 1
	var direction [][]int
	for len(que) > 0 {
		tmp := que[0]
		que = que[1:]
		dist, point := tmp.hop, tmp.point
		if point.y%2 == 0 {
			direction = direction1
		} else {
			direction = direction2
		}
		for _, d := range direction {
			nx, ny := point.x+d[0], point.y+d[1]
			if !check[ny][nx] && mp[ny][nx] != -1 {
				check[ny][nx] = true
				if mp[ny][nx] > dist+1 {
					ans++
				}
				que = append(que, Entry{dist + 1, Point{nx, ny}})
			}
		}
	}
	return ans
}

C++: #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;
			
	}
}