#include<bits/stdc++.h>
struct DSU {
std::vector<int> p;
DSU() = default;
DSU(int n) : p(n) {
std::iota(p.begin(), p.end(), 0);
}
int get(int u) {
while (u != p[u]) u = p[u] = p[p[u]];
return u;
}
bool unite(int u, int v) {
if ((u = get(u)) == (v = get(v))) return false;
p[v] = u;
return true;
}
};
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
std::cin >> n >> m;
std::vector a(n + 2, std::vector<int>(m + 2));
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
std::cin >> a[i][j];
}
}
for (int i = 0; i < n + 2; ++i) {
for (int j = 0; j < m + 2; ++j) {
if (i == 0 || i == n + 1 || j == 0 || j == m + 1) {
if (i == 0 && j == 0) a[i][j] = 0;
else if (i == n + 1 && j == m + 1) a[i][j] = 0;
else a[i][j] = 1;
}
}
}
n += 2, m += 2;
DSU dsu(n * m);
auto unite = [&](int i, int j) {
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
int x = i + dx, y = j + dy;
if (0 <= x && x < n && 0 <= y && y < m && a[x][y]) {
dsu.unite(i * m + j, x * m + y);
}
}
}
};
for (int i = 1; i + 1 < n; ++i) {
for (int j = 1; j + 1 < m; ++j) {
if (a[i][j]) unite(i, j);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (!a[i][j]) continue;
if (i == 0 || i == n - 1) {
if (j > 0 && a[i][j - 1]) {
dsu.unite(i * m + j, i * m + j - 1);
}
if (j + 1 < m && a[i][j]) {
dsu.unite(i * m + j, i * m + j + 1);
}
}
if (j == 0 || j == m - 1) {
if (i > 0 && a[i - 1][j]) {
dsu.unite(i * m + j, (i - 1) * m + j);
}
if (i + 1 < n && a[i + 1][j]) {
dsu.unite(i * m + j, (i + 1) * m + j);
}
}
}
}
int q;
std::cin >> q;
while (q--) {
int i, j;
std::cin >> i >> j;
bool c1 = false, c2 = false;
for (int dx = -1; dx <= 1; ++dx) {
for (int dy = -1; dy <= 1; ++dy) {
int x = i + dx, y = j + dy;
if (0 <= x && x < n && 0 <= y && y < m && a[x][y]) {
c1 |= dsu.get(x * m + y) == dsu.get((n - 1) * m);
c2 |= dsu.get(x * m + y) == dsu.get(m - 1);
}
}
}
if (c1 && c2) std::cout << "0\n";
else {
std::cout << "1\n";
a[i][j] = 1;
unite(i, j);
}
}
}