#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
// 动态分配棋盘内存
int **board = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
board[i] = (int *)malloc(n * sizeof(int));
}
// 读取棋盘数据
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &board[i][j]);
}
}
int q;
scanf("%d", &q);
// 动态分配查询内存
int **ask = (int **)malloc(q * sizeof(int *));
for (int i = 0; i < q; i++) {
ask[i] = (int *)malloc(4 * sizeof(int));
}
// 读取查询
for (int i = 0; i < q; i++) {
for (int j = 0; j < 4; j++) {
scanf("%d", &ask[i][j]);
}
}
// 处理每个查询
for (int i = 0; i < q; i++) {
// 将1-based坐标转换为0-based
int x1 = ask[i][0] - 1;
int y1 = ask[i][1] - 1;
int x2 = ask[i][2] - 1;
int y2 = ask[i][3] - 1;
int x = x1;
int y = y1;
while (1) {
int cell = board[x][y]; // 获取当前位置的值
if (cell == 0) {
// 向下移动:检查下一步是否超出下边界
if (x + 1 <= x2) {
x++; // 仍在子矩阵内,移动
} else {
// 下一步超出边界,输出当前位置(1-based)
printf("%d %d\n", x + 1, y + 1);
break;
}
} else if (cell == 1) {
// 向右移动:检查下一步是否超出右边界
if (y + 1 <= y2) {
y++; // 仍在子矩阵内,移动
} else {
// 下一步超出边界,输出当前位置(1-based)
printf("%d %d\n", x + 1, y + 1);
break;
}
}
}
}
// 释放内存
for (int i = 0; i < n; i++) {
free(board[i]);
}
free(board);
for (int i = 0; i < q; i++) {
free(ask[i]);
}
free(ask);
return 0;
}