#include #include #include using namespace std; #pragma warning (disable: 4996) // 入力 int H, A[2509]; int W, B[2509]; int K, X[19], Y[19]; // その他 int Answer[2509][2509]; bool used[2509][2509]; bool forced[2509][2509]; int main() { // 入力 cin >> H >> W; for (int i = 1; i <= H; i++) cin >> A[i]; for (int i = 1; i <= W; i++) cin >> B[i]; cin >> K; for (int i = 1; i <= K; i++) cin >> X[i] >> Y[i]; // 貪欲法 vector> CA, CB; for (int i = 1; i <= K; i++) forced[X[i]][Y[i]] = true; for (int i = 1; i <= H; i++) CA.push_back(make_pair(A[i], -i)); for (int i = 1; i <= W; i++) CB.push_back(make_pair(B[i], -i)); sort(CA.begin(), CA.end()); reverse(CA.begin(), CA.end()); sort(CB.begin(), CB.end()); reverse(CB.begin(), CB.end()); for (int i = 0; i < H; i++) { for (int j = 0; j < CA[i].first; j++) used[-CA[i].second][-CB[j].second] = true; for (int j = 0; j < CA[i].first; j++) CB[j].first -= 1; sort(CB.begin(), CB.end()); reverse(CB.begin(), CB.end()); } if (CB[0].first >= 1) { printf(":(\n"); return 0; } // 判定 int SA = 0; for (int i = 1; i <= H; i++) SA += A[i]; int SB = 0; for (int i = 1; i <= W; i++) SB += B[i]; if (SA != SB) { printf(":(\n"); return 0; } // 書き換え for (int i = 1; i <= K; i++) { if (used[X[i]][Y[i]] == false) continue; bool flag = false; for (int j = 1; j <= H; j++) { for (int k = 1; k <= W; k++) { if (used[X[i]][k] == true || forced[X[i]][k] == true) continue; if (used[j][Y[i]] == true || forced[j][Y[i]] == true) continue; if (used[j][k] == false) continue; flag = true; used[X[i]][k] = true; used[j][Y[i]] = true; used[j][k] = false; break; } if (flag == true) break; } if (flag == false) { cout << ":(" << endl; return 0; } } // 出力 printf("Yay!\n"); for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) { if (forced[i][j] == true) printf("x"); else if (used[i][j] == true) printf("o"); else printf("."); } printf("\n"); } return 0; }