package bj.gold.l4;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.StringTokenizer;
/**
* @author 은서파
* @since 2021. 10. 15.
* @see https://www.acmicpc.net/problem/14499
* @performance 11900 84
* @category #시뮬레이션
* @memo
*/
public class BJ_G4_14499_주사위굴리기 {
static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder output = new StringBuilder();
static StringTokenizer tokens;
static int N, M, R, C, K; // 지도의 세로, 가로, 주사위의 R, C, 명령의 개수
static int[][] map;
// 방향에 따른 좌표 변화: 동(1)/서(2)/북(3)/남(4)
static int[][] deltas = { {}, { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };
public static void main(String[] args) throws IOException {
input = new BufferedReader(new StringReader(src));
tokens = new StringTokenizer(input.readLine());
N = Integer.parseInt(tokens.nextToken());
M = Integer.parseInt(tokens.nextToken());
R = Integer.parseInt(tokens.nextToken());
C = Integer.parseInt(tokens.nextToken());
K = Integer.parseInt(tokens.nextToken());
map = new int[N][M];
for (int r = 0; r < N; r++) {
tokens = new StringTokenizer(input.readLine());
for (int c = 0; c < M; c++) {
map[r][c] = Integer.parseInt(tokens.nextToken());
}
}// 지도 입력 완료
tokens = new StringTokenizer(input.readLine());
Dice dice = new Dice(R, C);
for (int k = 0; k < K; k++) {
int dir = Integer.parseInt(tokens.nextToken());
// 이 방향으로 굴리면서 정답 출력
int nr = dice.r + deltas[dir][0];
int nc = dice.c + deltas[dir][1];
if (isIn(nr, nc)) {
dice.r = nr;
dice.c = nc;
int top = dice.roll(dir);
output.append(top).append('\n');
}
}
System.out.println(output);
}
private static boolean isIn(int r, int c) {
return 0 <= r && r < N && 0 <= c && c < M;
}
static class Dice {
int r, c;
// 처음에 주사위의 모든 면은 0
int[] dice = new int[6];
public Dice(int r, int c) {
this.r = r;
this.c = c;
}
// 주사위의 방향을 미리 변수로 만들어두자.
int TOP = 0, BOTTOM = 1, FRONT = 2, REAR = 3, LEFT = 4, RIGHT = 5;
public int roll(int d) {
if (d == 1) { // 동쪽으로 돌릴 때
rotate(BOTTOM, LEFT, TOP, RIGHT);
} else if (d == 2) { // 서쪽으로 돌릴 때
rotate(BOTTOM, RIGHT, TOP, LEFT);
} else if (d == 3) { // 북쪽으로 돌릴 때
rotate(BOTTOM, FRONT, TOP, REAR);
} else { // 남쪽으로 돌릴 때
rotate(BOTTOM, REAR, TOP, FRONT);
}
// 바닥의 값에 따라서 주사위와 상호 작용
if (map[r][c] == 0) { // 주사위의 값을 map에 복사해주기
map[r][c] = dice[BOTTOM];
} else { //map의 값을 주사위에 복사하기, 지도는 0
dice[BOTTOM] = map[r][c];
map[r][c] = 0;
}
// 꼭대기에 있는 값을 반환!
return dice[TOP];
}
private void rotate(int a, int b, int c, int d) {
int temp = dice[d];
dice[d] = dice[c];
dice[c] = dice[b];
dice[b] = dice[a];
dice[a] = temp;
}
}
// REMOVE_START
private static String src = "3 3 0 0 16\r\n" +
"0 1 2\r\n" +
"3 4 5\r\n" +
"6 7 8\r\n" +
"4 4 1 1 3 3 2 2 4 4 1 1 3 3 2 2";
// REMOVE_END
}