// 12시 방향부터 시계 방향대로 입력 gear[5][8] - 0은 더미
// 회전 방향 입력
// 회전하는 톱니바퀴 + 방향;1=시계, -1=반시계
// 인덱스를 활용하여 회전 시킴 or, sl, sr, tl, tr, fl
// 회전할때 3시, 9시 방향을 기준으로 돌리것과 반대 방향으로 돌아감. 값이 다를 경우만
// 12시방향값으로 점수내기 -s(1)일때만 점수=톱니바퀴 번호만큼 점수 발생
로 생각
=>
각 톱니바퀴가 회전할지, 회전한다면 어떤 방향으로 돌지를 저장할 배열 필요 - 돌리기전 상태 파악을 위해
동일한 코드를 위해 인덱스가 아니라 계속 회전 시키기 - 시간복잡도가 크면 안되지만, 84k(100)번 계산으로 값이 많이 안크기에 진행
점수 파악을 잘못함 -> 이럴꺼면 굳이 gear[5][8]가 아니라 gear[4][8] 사용이 나음
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int[][] gear = new int[5][8];
static int k;
static int[] rotate = new int[5];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 12시 방향부터 시계 방향대로 입력 gear[5][8]
for(int i=0;i<4;i++){
String val = br.readLine();
for(int j=0;j<8;j++){
gear[i+1][j] = val.charAt(j) - '0';
}
}
k = Integer.parseInt(br.readLine());
for(int i=0;i<k;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int g = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
Arrays.fill(rotate,0); // 초기화
rotate[g]=r;
// 회전하는 톱니바퀴 + 방향;1=시계, -1=반시계
// 회전할때 3시, 9시 방향을 기준으로 돌리것과 반대 방향으로 돌아감. 값이 다를 경우만
// 왼쪽 회전
for(int j=g;j>1;j--){
if(gear[j][6] != gear[j-1][2]){
rotate[j-1] = -rotate[j]; // 부호 반전
}
else break;
}
// 오른쪽 회전
for(int j=g;j<4;j++){
if(gear[j][2] != gear[j+1][6]){
rotate[j+1] = -rotate[j];
}
else break;
}
// 실제 회전
for(int j=1;j<=4;j++){
if(rotate[j] == 1){ // 시계 방향
int tmp = gear[j][7];
for(int k=7;k>0;k--){
gear[j][k] = gear[j][k-1];
}
gear[j][0] = tmp;
}
else if(rotate[j] == -1){ // 반시계 방향
int tmp = gear[j][0];
for(int k=1;k<8;k++){
gear[j][k-1] = gear[j][k];
}
gear[j][7] = tmp;
}
}
}
// 12시방향값으로 점수내기 - s(1)일때만 점수=톱니바퀴 번호가 아니라 2^톱니바퀴 번호
int ans = 0;
for(int i=1;i<=4;i++){
if(gear[i][0]==1) ans += 1<<(i-1);
}
System.out.println(ans);
}
}