#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int arr[100][100]; // 0: 빈 공간, 1: 미네랄
int bfs_arr[100][100]; // 0: 빈 공간, 1: 확인 X, 2: 바닥에 붙어 있는 미네랄, 3: 공중에 떠 있는 미네랄
void bfs(int R, int C, int y, int x, int value) {
int dy[4] = { 0,0,1,-1 };
int dx[4] = { 1,-1,0,0 };
queue<pair<int, int>> q;
q.push(make_pair(y, x));
bfs_arr[y][x] = value;
while (!q.empty()) {
int y = q.front().first;
int x = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
if (0 <= ny && ny < R && 0 <= nx && nx < C) {
if (bfs_arr[ny][nx] == 1) {
q.push(make_pair(ny, nx));
bfs_arr[ny][nx] = value;
}
}
}
}
}
/**
* return 0: 섬 1개, 1: 섬 2개 이상
*/
int world_bfs(int R, int C) {
int island = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
bfs_arr[i][j] = arr[i][j];
}
}
for (int i = 0; i < C; i++) {
if (R - 1 >= 0 && bfs_arr[R - 1][i] == 1) {
bfs(R, C, R - 1, i, 2);
}
}
// 바닥에 붙은 미네랄 처리
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (bfs_arr[i][j] == 1) {
bfs(R, C, i, j, 3);
island = 1;
}
}
}
// 공중에 떠 있는 미네랄 처리
return island;
}
/**
* return 0: 내리기 실패, 1: 내리기 성공
*/
int drop(int R, int C) {
int check_arr[100][100];
int check = 1;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
check_arr[i][j] = bfs_arr[i][j];
}
}
for (int i = 0; i < C; i++) {
if (check_arr[R - 1][i] == 3) {
check = 0;
return check;
}
// case 1: 바닥에 닿는 경우
}
for (int i = R - 2; i >= 0; i--) {
for (int j = 0; j < C; j++) {
if (check_arr[i][j] == 3 && check_arr[i + 1][j] == 2) {
check = 0;
return check;
}
// case 2: 클러스터에 닿는 경우
else if (check_arr[i][j] == 3 && check_arr[i + 1][j] == 0) {
check_arr[i + 1][j] = check_arr[i][j];
check_arr[i][j] = 0;
}
// case 3: 내려도 되는 경우
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
bfs_arr[i][j] = check_arr[i][j];
}
}
return check;
}
void break_mineral(queue<int>& height, int R, int C, int N, int dir) {
int h = R - height.front();
height.pop();
if (dir == 0) {
for (int i = 0; i < C; i++) {
if (arr[h][i] == 1) {
arr[h][i] = 0;
break;
}
}
}
else {
for (int i = C - 1; i >= 0; i--) {
if (arr[h][i] == 1) {
arr[h][i] = 0;
break;
}
}
}
}
void sol(queue<int>& height, int R, int C, int N) {
int dir = 0; // 0: 왼쪽 1: 오른쪽
for (int i = 0; i < N; i++) {
if (!height.empty()) {
break_mineral(height, R, C, N, dir);
dir = (dir + 1) % 2;
}
// 막대기 투척 코드
int island = world_bfs(R, C);
// BFS 코드
if (island == 1) {
while (drop(R, C) == 1) {}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (bfs_arr[i][j] != 0)
arr[i][j] = 1;
else
arr[i][j] = 0;
}
}
// arr 갱신 코드
}
}
int main() {
int R, C;
int N;
queue<int> height;
cin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
char input;
cin >> input;
if (input == '.') {
arr[i][j] = 0;
}
else {
arr[i][j] = 1;
}
}
}
cin >> N;
for (int i = 0; i < N; i++) {
int input;
cin >> input;
height.push(input);
}
sol(height, R, C, N);
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (arr[i][j] == 0)
cout << '.';
else
cout << 'X';
}
if (i != R - 1) cout << endl;
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGU8cXVldWU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKaW50IGFyclsxMDBdWzEwMF07IC8vIDA6IOu5iCDqs7XqsIQsIDE6IOuvuOuEpOuehAppbnQgYmZzX2FyclsxMDBdWzEwMF07IC8vIDA6IOu5iCDqs7XqsIQsIDE6IO2ZleyduCBYLCAyOiDrsJTri6Xsl5Ag67aZ7Ja0IOyeiOuKlCDrr7jrhKTrnoQsIDM6IOqzteykkeyXkCDrlqAg7J6I64qUIOuvuOuEpOuehCAKCgp2b2lkIGJmcyhpbnQgUiwgaW50IEMsIGludCB5LCBpbnQgeCwgaW50IHZhbHVlKSB7CglpbnQgZHlbNF0gPSB7IDAsMCwxLC0xIH07CglpbnQgZHhbNF0gPSB7IDEsLTEsMCwwIH07CgoJcXVldWU8cGFpcjxpbnQsIGludD4+IHE7CglxLnB1c2gobWFrZV9wYWlyKHksIHgpKTsKCWJmc19hcnJbeV1beF0gPSB2YWx1ZTsKCgl3aGlsZSAoIXEuZW1wdHkoKSkgewoJCWludCB5ID0gcS5mcm9udCgpLmZpcnN0OwoJCWludCB4ID0gcS5mcm9udCgpLnNlY29uZDsKCQlxLnBvcCgpOwoKCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewoJCQlpbnQgbnkgPSB5ICsgZHlbaV07CgkJCWludCBueCA9IHggKyBkeFtpXTsKCQkJaWYgKDAgPD0gbnkgJiYgbnkgPCBSICYmIDAgPD0gbnggJiYgbnggPCBDKSB7CgkJCQlpZiAoYmZzX2FycltueV1bbnhdID09IDEpIHsKCQkJCQlxLnB1c2gobWFrZV9wYWlyKG55LCBueCkpOwoJCQkJCWJmc19hcnJbbnldW254XSA9IHZhbHVlOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgovKioKKiByZXR1cm4gMDog7ISsIDHqsJwsIDE6IOyErCAy6rCcIOydtOyDgQoqLwppbnQgd29ybGRfYmZzKGludCBSLCBpbnQgQykgewoJaW50IGlzbGFuZCA9IDA7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBSOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IEM7IGorKykgewoJCQliZnNfYXJyW2ldW2pdID0gYXJyW2ldW2pdOwoJCX0KCX0KCglmb3IgKGludCBpID0gMDsgaSA8IEM7IGkrKykgewoJCWlmIChSIC0gMSA+PSAwICYmIGJmc19hcnJbUiAtIDFdW2ldID09IDEpIHsKCQkJYmZzKFIsIEMsIFIgLSAxLCBpLCAyKTsKCQl9Cgl9CgkvLyDrsJTri6Xsl5Ag67aZ7J2AIOuvuOuEpOuehCDsspjrpqwKCglmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgQzsgaisrKSB7CgkJCWlmIChiZnNfYXJyW2ldW2pdID09IDEpIHsKCQkJCWJmcyhSLCBDLCBpLCBqLCAzKTsKCQkJCWlzbGFuZCA9IDE7CgkJCX0KCQl9Cgl9CgkvLyDqs7XspJHsl5Ag65agIOyeiOuKlCDrr7jrhKTrnoQg7LKY66asCgoJcmV0dXJuIGlzbGFuZDsKfQoKLyoqCiogcmV0dXJuIDA6IOuCtOumrOq4sCDsi6TtjKgsIDE6IOuCtOumrOq4sCDshLHqs7UKKi8KaW50IGRyb3AoaW50IFIsIGludCBDKSB7CglpbnQgY2hlY2tfYXJyWzEwMF1bMTAwXTsKCWludCBjaGVjayA9IDE7CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBSOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IEM7IGorKykgewoJCQljaGVja19hcnJbaV1bal0gPSBiZnNfYXJyW2ldW2pdOwoJCX0KCX0KCglmb3IgKGludCBpID0gMDsgaSA8IEM7IGkrKykgewoJCWlmIChjaGVja19hcnJbUiAtIDFdW2ldID09IDMpIHsKCQkJY2hlY2sgPSAwOwoJCQlyZXR1cm4gY2hlY2s7CgkJfQoJCS8vIGNhc2UgMTog67CU64ul7JeQIOuLv+uKlCDqsr3smrAKCX0KCWZvciAoaW50IGkgPSBSIC0gMjsgaSA+PSAwOyBpLS0pIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IEM7IGorKykgewoKCQkJaWYgKGNoZWNrX2FycltpXVtqXSA9PSAzICYmIGNoZWNrX2FycltpICsgMV1bal0gPT0gMikgewoJCQkJY2hlY2sgPSAwOwoJCQkJcmV0dXJuIGNoZWNrOwoJCQl9CgkJCS8vIGNhc2UgMjog7YG065+s7Iqk7YSw7JeQIOuLv+uKlCDqsr3smrAKCQkJZWxzZSBpZiAoY2hlY2tfYXJyW2ldW2pdID09IDMgJiYgY2hlY2tfYXJyW2kgKyAxXVtqXSA9PSAwKSB7CgkJCQljaGVja19hcnJbaSArIDFdW2pdID0gY2hlY2tfYXJyW2ldW2pdOwoJCQkJY2hlY2tfYXJyW2ldW2pdID0gMDsKCQkJfQoJCQkvLyBjYXNlIDM6IOuCtOugpOuPhCDrkJjripQg6rK97JqwCgoJCX0KCX0KCglmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgQzsgaisrKSB7CgkJCWJmc19hcnJbaV1bal0gPSBjaGVja19hcnJbaV1bal07CgkJfQoJfQoJcmV0dXJuIGNoZWNrOwp9Cgp2b2lkIGJyZWFrX21pbmVyYWwocXVldWU8aW50PiYgaGVpZ2h0LCBpbnQgUiwgaW50IEMsIGludCBOLCBpbnQgZGlyKSB7CglpbnQgaCA9IFIgLSBoZWlnaHQuZnJvbnQoKTsKCWhlaWdodC5wb3AoKTsKCglpZiAoZGlyID09IDApIHsKCQlmb3IgKGludCBpID0gMDsgaSA8IEM7IGkrKykgewoJCQlpZiAoYXJyW2hdW2ldID09IDEpIHsKCQkJCWFycltoXVtpXSA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCWVsc2UgewoJCWZvciAoaW50IGkgPSBDIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJaWYgKGFycltoXVtpXSA9PSAxKSB7CgkJCQlhcnJbaF1baV0gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0KCnZvaWQgc29sKHF1ZXVlPGludD4mIGhlaWdodCwgaW50IFIsIGludCBDLCBpbnQgTikgewoJaW50IGRpciA9IDA7IC8vIDA6IOyZvOyqvSAxOiDsmKTrpbjsqr0KCWZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CgkJaWYgKCFoZWlnaHQuZW1wdHkoKSkgewoJCQlicmVha19taW5lcmFsKGhlaWdodCwgUiwgQywgTiwgZGlyKTsKCQkJZGlyID0gKGRpciArIDEpICUgMjsKCQl9CgkJLy8g66eJ64yA6riwIO2IrOyymSDsvZTrk5wKCgkJaW50IGlzbGFuZCA9IHdvcmxkX2JmcyhSLCBDKTsKCQkvLyBCRlMg7L2U65OcCgoJCWlmIChpc2xhbmQgPT0gMSkgewoJCQl3aGlsZSAoZHJvcChSLCBDKSA9PSAxKSB7fQoJCX0KCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBSOyBpKyspIHsKCQkJZm9yIChpbnQgaiA9IDA7IGogPCBDOyBqKyspIHsKCQkJCWlmIChiZnNfYXJyW2ldW2pdICE9IDApCgkJCQkJYXJyW2ldW2pdID0gMTsKCQkJCWVsc2UKCQkJCQlhcnJbaV1bal0gPSAwOwoJCQl9CgkJfQoJCS8vIGFyciDqsLHsi6Ag7L2U65OcCgl9Cn0KCmludCBtYWluKCkgewoJaW50IFIsIEM7CglpbnQgTjsKCXF1ZXVlPGludD4gaGVpZ2h0OwoKCWNpbiA+PiBSID4+IEM7Cglmb3IgKGludCBpID0gMDsgaSA8IFI7IGkrKykgewoJCWZvciAoaW50IGogPSAwOyBqIDwgQzsgaisrKSB7CgkJCWNoYXIgaW5wdXQ7CgkJCWNpbiA+PiBpbnB1dDsKCQkJaWYgKGlucHV0ID09ICcuJykgewoJCQkJYXJyW2ldW2pdID0gMDsKCQkJfQoJCQllbHNlIHsKCQkJCWFycltpXVtqXSA9IDE7CgkJCX0KCQl9Cgl9CgoJY2luID4+IE47Cglmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewoJCWludCBpbnB1dDsKCQljaW4gPj4gaW5wdXQ7CgkJaGVpZ2h0LnB1c2goaW5wdXQpOwoJfQoKCXNvbChoZWlnaHQsIFIsIEMsIE4pOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgUjsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBDOyBqKyspIHsKCQkJaWYgKGFycltpXVtqXSA9PSAwKQoJCQkJY291dCA8PCAnLic7CgkJCWVsc2UKCQkJCWNvdXQgPDwgJ1gnOwoJCX0KCQlpZiAoaSAhPSBSIC0gMSkgY291dCA8PCBlbmRsOwoJfQoKCXJldHVybiAwOwp9