import java.io.*; import java.util.*; public class D { static char[][] board = new char[1000][1000]; static int rows, cols; static char bget(int r, int c) { if (r < 0 || r >= rows || c < 0 || c >= cols) return 'X'; return board[r][c]; } static void trace(int r, int c, int dr, int dc, int len) { while (len-- != 0) { r += dr; c += dc; if (Character.isLetter(bget(r, c))) break; board[r][c] = '*'; } } public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer tok; for (int casei = 1; ; ++casei) { tok = new StringTokenizer(in.readLine()); rows = Integer.parseInt(tok.nextToken()); cols = Integer.parseInt(tok.nextToken()); if (rows == 0) break; for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { board[r][c] = ' '; } } int n; String pieces = "QKP"; for (int i = 0; i < 3; ++i) { tok = new StringTokenizer(in.readLine()); n = Integer.parseInt(tok.nextToken()); while (n-- > 0) { int r = Integer.parseInt(tok.nextToken()) - 1; int c = Integer.parseInt(tok.nextToken()) - 1; board[r][c] = pieces.charAt(i); } } for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { if (board[r][c] == 'Q') { trace(r, c, +1, +1, -1); trace(r, c, +1, +0, -1); trace(r, c, +1, -1, -1); trace(r, c, +0, +1, -1); trace(r, c, +0, -1, -1); trace(r, c, -1, +1, -1); trace(r, c, -1, +0, -1); trace(r, c, -1, -1, -1); } else if (board[r][c] == 'K') { trace(r, c, +2, +1, 1); trace(r, c, +2, -1, 1); trace(r, c, +1, +2, 1); trace(r, c, +1, -2, 1); trace(r, c, -2, +1, 1); trace(r, c, -2, -1, 1); trace(r, c, -1, +2, 1); trace(r, c, -1, -2, 1); } } } int count = 0; for (int r = 0; r < rows; ++r) { for (int c = 0; c < cols; ++c) { if (board[r][c] == ' ') ++count; } } System.out.println("Board " + casei + " has " + count + " safe squares."); } } }