#include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,n) for (int i = 0; i < n; i++) #define abs(x) ((x)<0?(-(x)):(x)) #define REP(i,v) for (unsigned i = 0; i < v.size(); i++) #define RL(i,v) for (unsigned i = 0; i < v.length(); i++) typedef long long ll; const int MAX = 128; const int MASK = 1048576; map < vector , int> dp[20]; int pcs[4][3][2] = { { {0, 0}, {0, 1}, {1, 0} }, { {0, 0}, {0, 1}, {1, 1} }, { {0, 0}, {1, 0}, {1, 1} }, { {0, 1}, {1, 0}, {1, 1} } }; int possible(int code) { int brd[2][16]; int len = code / MASK, mask = code % MASK; for (int row = 1; row >= 0; row--) for (int col = len - 1; col >= 0; col--) {brd[row][col] = (mask & 1); mask >>= 1;} for (int at = 0; at + 1 < len; at++) { for (int i = 0; i < 4; i++) { int flag = 1; for (int c = 0; c < 3; c++) if (brd[pcs[i][c][0]][at + pcs[i][c][1]]) {flag = 0; break;} if (flag) return 1; } } return 0; } int go(vector v, int rem) { if (rem == 0 && v.size() == 0) return 1; if (rem == 0 || v.size() == 0) return 0; if (dp[rem].find(v) != dp[rem].end()) return dp[rem][v]; int ans = 0; int board[2][16]; for (int i = 0; i < (int)v.size(); i++) { int len = v[i] / MASK, mask = v[i] % MASK; for (int row = 1; row >= 0; row--) for (int col = len - 1; col >= 0; col--) {board[row][col] = (mask & 1); mask >>= 1;} for (int col = 0; col + 1 < len; col++) { for (int c = 0; c < 4; c++) { int flag = 1; for (int j = 0; j < 3; j++) if (board[pcs[c][j][0]][col + pcs[c][j][1]]) {flag = 0; break;} if (!flag) continue; for (int j = 0; j < 3; j++) board[pcs[c][j][0]][col + pcs[c][j][1]] = 1; vector < int > nv; for (int j = 0; j < (int)v.size(); j++) if (j != i) nv.push_back(v[j]); int splitLeft = col; while (splitLeft > 0 && board[0][splitLeft] && board[1][splitLeft]) splitLeft--; if (splitLeft > 0) { int size = splitLeft + 1, mask = 0; for (int k = 0; k < 2; k++) for (int j = 0; j <= splitLeft; j++) mask = mask * 2 + board[k][j]; int code = size * MASK + mask; if (possible(code)) { nv.push_back(code); int tmp = nv.size() - 1; while (tmp > 0 && nv[tmp] < nv[tmp - 1]) {swap(nv[tmp - 1], nv[tmp]); tmp--;} } } int splitRight = col + 1; while (splitRight + 1 < len && board[0][splitRight] && board[1][splitRight]) splitRight++; if (splitRight + 1 < len) { int size = len - splitRight, mask = 0; for (int k = 0; k < 2; k++) for (int j = splitRight; j < len; j++) mask = mask * 2 + board[k][j]; int code = size * MASK + mask; if (possible(code)) { nv.push_back(code); int tmp = nv.size() - 1; while (tmp > 0 && nv[tmp] < nv[tmp - 1]) {swap(nv[tmp - 1], nv[tmp]); tmp--;} } } /* int size = 0; for (int j = 0; j < (int)nv.size(); j++) { if (j + 1 < (int)nv.size() && nv[j] == nv[j + 1]) {j++; continue;} nv[size++] = nv[j]; } nv.resize(size); */ int cans = 1; for (int j = 0; j < 20; j++) if (j != rem - 1 && go(nv, j)) {cans = 0; break;} if (cans) {ans = 1; break;} for (int j = 0; j < 3; j++) board[pcs[c][j][0]][col + pcs[c][j][1]] = 0; } if (ans) break; } if (ans) break; } return dp[rem][v] = ans; } void solve(void) { FILE* f = fopen("puzzle.in", "rt"); FILE* fo = fopen("puzzle.out", "wt"); int n, m, k; static int board[MAX][MAX]; fscanf(f, "%d %d %d", &n, &m, &k); memset(board, 0, sizeof(board)); for (int i = 0; i < k; i++) { int row, col; fscanf(f, "%d %d", &row, &col); board[row][col] = 1; } int xr = 0, ans = 0; for (int row = 0; row < n; row += 2) { vector v; int size = m, mask = 0; for (int i = 0; i < 2; i++) for (int c = 0; c < m; c++) mask = mask * 2 + board[row + i][c]; int code = size * MASK + mask; if (possible(code)) v.push_back(code); sort(v.begin(), v.end()); /* int size = 0; for (int i = 0; i < (int)v.size(); i++) { if (i + 1 < (int)v.size() && v[i] == v[i + 1]) {i += 1; continue;} v[size++] = v[i]; } v.resize(size); */ int what = 0; for (int i = 0; i < 20; i++) if (go(v, i)) what |= (i % 2 + 1); if (what == 3) ans++; if (what == 2) xr ^= 1; } // cout << "xor " << xr << " with ans " << ans << endl; // system("pause"); int winner = ((ans % 2) | (!xr)); fprintf(fo, "%s\n", winner ? "bad" : "good"); fclose(f); fclose(fo); } int main(void) { solve(); return 0; }