/*
17:28 톱니바퀴 문제 풀기 시작합니다.
최종 톱니바퀴의 상태를 구하는 프로그램
40분컷
*/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int map[5][8];
int ans;
string str;
int K;
struct point {
int num, dir;
}command[101];
int flag1, flag2, flag3, flag4;
int tmp;
void problemIn() {
for (int i = 1; i <= 4; i++) {
cin >> str;
for (int j = 0; j < 8; j++) {
if (str[j] == '1') map[i][j] = 1;
else if (str[j] == '0') map[i][j] = 0;
}
}
cin >> K;
for (int i = 0; i < K; i++) {
cin >> command[i].num;
cin >> command[i].dir;
}
}
void tob_check(int num, int dir) {
if (num == 1) {
if (dir == -1) {
flag1 = -1;
if (map[num][2] != map[num + 1][6]) {
flag2 = 1;
if (map[num + 1][2] != map[num + 2][6]) {
flag3 = -1;
if (map[num + 2][2] != map[num + 3][6]) {
flag4 = 1;
}
}
}
}
else {
flag1 = 1;
if (map[num][2] != map[num + 1][6]) {
flag2 = -1;
if (map[num + 1][2] != map[num + 2][6]) {
flag3 = 1;
if (map[num + 2][2] != map[num + 3][6]) {
flag4 = -1;
}
}
}
}
}
else if (num == 2) {
if (dir == -1) { // 반시계방향,
flag2 = -1;
if (map[num][6] != map[num - 1][2]) {
flag1 = 1; // 4번째 톱니 돌아갑니다.
}
if (map[num][2] != map[num + 1][6]) {
flag3 = 1;
if (map[num + 1][2] != map[num + 2][6]) {
flag4 = -1; // 반시계방향
}
}
}
else { // 시계방향
flag2 = 1;
if (map[num][6] != map[num - 1][2]) {
flag1 = -1; // 4번째 톱니 돌아갑니다.
}
if (map[num][2] != map[num + 1][6]) {
flag3 = -1;
if (map[num + 1][2] != map[num + 2][6]) {
flag4 = 1; // 반시계방향
}
}
}
}
else if (num == 3) {
if (dir == -1) { // 반시계방향,
flag3 = -1;
if (map[num][2] != map[num + 1][6]) {
flag4 = 1; // 4번째 톱니 돌아갑니다.
}
if (map[num][6] != map[num - 1][2]) {
flag2 = 1;
if (map[num - 1][6] != map[num - 2][2]) {
flag1 = -1; // 반시계방향
}
}
}
else { // 시계방향
flag3 = 1;
if (map[num][2] != map[num + 1][6]) {
flag4 = -1; // 4번째 톱니 돌아갑니다.
}
if (map[num][6] != map[num - 1][2]) {
flag2 = -1;
if (map[num - 1][6] != map[num - 2][2]) {
flag1 = 1; // 반시계방향
}
}
}
}
else if (num == 4) {
if (dir == -1) {
flag4 = -1;
if (map[num][6] != map[num - 1][2]) {
flag3 = 1;
if (map[num - 1][6] != map[num - 2][2]) {
flag2 = -1;
if (map[num - 2][6] != map[num - 3][2]) {
flag1 = 1;
}
}
}
}
else {
flag4 = 1;
if (map[num][6] != map[num - 1][2]) {
flag3 = -1;
if (map[num - 1][6] != map[num - 2][2]) {
flag2 = +1;
if (map[num - 2][6] != map[num - 3][2]) {
flag1 = -1;
}
}
}
}
}
}
/*
1 0 1 0 1 1 1 1
1 1 0 1 0 1 1 1
*/
void tob_turn() {
if (flag1 == 1) {
tmp = map[1][7];
for (int i = 6; i >= 0; i--) {
swap(map[1][i], map[1][i + 1]);
}
map[1][0] = tmp;
}
else if (flag1 == -1) {
tmp = map[1][0];
for (int i = 0; i < 7; i++) {
swap(map[1][i], map[1][i+1]);
}
map[1][7] = tmp;
}
if (flag2 == 1) {
tmp = map[2][7];
for (int i = 6; i >= 0; i--) {
swap(map[2][i], map[2][i + 1]);
}
map[2][0] = tmp;
}
else if (flag2 == -1) {
tmp = map[2][0];
for (int i = 0; i < 7; i++) {
swap(map[2][i], map[2][i + 1]);
}
map[2][7] = tmp;
}
if (flag3 == 1) {
tmp = map[3][7];
for (int i = 6; i >= 0; i--) {
swap(map[3][i], map[3][i + 1]);
}
map[3][0] = tmp;
}
else if (flag3 == -1) {
tmp = map[3][0];
for (int i = 0; i < 7; i++) {
swap(map[3][i], map[3][i + 1]);
}
map[3][7] = tmp;
}
if (flag4 == 1) {
tmp = map[4][7];
for (int i = 6; i >= 0; i--) {
swap(map[4][i], map[4][i + 1]);
}
map[4][0] = tmp;
}
else if (flag4 == -1) {
tmp = map[4][0];
for (int i = 0; i < 7; i++) {
swap(map[4][i], map[4][i + 1]);
}
map[4][7] = tmp;
}
}
void solve() {
for (int i = 0; i < K; i++) {
tob_check(command[i].num, command[i].dir);
tob_turn();
flag1 = flag2 = flag3 = flag4 = 0;
}
if (map[1][0] == 1) ans += 1;
if (map[2][0] == 1) ans += 2;
if (map[3][0] == 1) ans += 4;
if (map[4][0] == 1) ans += 8;
}
int main() {
problemIn();
solve();
cout << ans << endl;
return 0;
}