#include <iostream>
#include <algorithm>
#include <vector>
#define forn(i,n) for(int i=0;i<(int)n;++i)
#define DBG(a) cerr<<#a<<" = "<<a<<endl
#define DBGA(a) cerr<<#a<<" = "<<a<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)
#define DBG3(a,b,c) do{DBGA(a)DBGA(b)DBG(c);}while(0)
#define DBG4(a,b,c,d) do{DBGA(a)DBGA(b)DBGA(c)DBG(d);}while(0)
#define SZ(v) (int)v.size()
using namespace std;
template<typename T>
ostream &operator<<(ostream &os, vector<T> &v){
os<<"[";
forn(i,SZ(v)){
if(i) os<<", ";
os<<v[i];
}
os<<"]";
return os;
}
const int MAXNM = 1005, DIR = 2;
vector<pair<int,int>> rd = {{0, 1}, {1, 0}};
vector<pair<int,int>> ul = {{-1, 0}, {0, -1}};
typedef vector<vector<int>> Matrix;
int n, m;
Matrix grid, cnt1, cnt2, tch;
bool valid(int r, int c){
return r>=0&&r<n&&c>=0&&c<m;
}
void erase(int r, int c, vector<pair<int,int>> &v, vector<vector<int>> &cnt){
if(cnt[r][c] == 0) return;
--cnt[r][c];
//~ DBG2(r, c);
//~ DBG2(r, c);
forn(i, SZ(v)){
int nr = r + v[i].first;
int nc = c + v[i].second;
//~ DBG2(nr, nc);
if(!valid(nr, nc)) continue;
if(grid[nr][nc]) continue;
//~ --cnt[nr][nc];
erase(nr, nc, v, cnt);
}
}
void erase(int r, int c){
//~ cnt1[r][c] = 0;
//~ cnt2[r][c] = 0;
//~ DBG("erase 1");
erase(r, c, rd, cnt1);
//~ DBG("erase 2");
erase(r, c, ul, cnt2);
}
void add(int r, int c, vector<pair<int,int>> &v, vector<vector<int>> &cnt){
for(auto x: v){
int nr = r + x.first;
int nc = c + x.second;
if(!valid(nr,nc)) continue;
if(grid[nr][nc]) continue;
++cnt[nr][nc];
}
}
void add1(int r, int c){
add(r, c, rd, cnt1);
}
void add2(int r, int c){
add(r, c, ul, cnt2);
}
int main(){
#ifdef LOCAL
freopen("input.in", "r", stdin);
#endif
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
grid.resize(n, vector<int>(m));
forn(i,n) forn(j,m) cin>>grid[i][j];
// poner los contadores
cnt1.resize(n, vector<int>(m));
cnt2.resize(n, vector<int>(m));
cnt1[0][0] = 1;
cnt2[n-1][m-1] = 1;
forn(i,n) forn(j,m){
if(grid[i][j]) continue;
if(!cnt1[i][j]) continue;
add1(i, j);
}
for(int i=n-1;i>=0;--i) for(int j=m-1;j>=0;--j){
if(grid[i][j]) continue;
if(!cnt2[i][j]) continue;
add2(i, j);
}
//~ DBG(cnt1);
//~ DBG(cnt2);
int q;
cin>>q;
while(q--){
int r, c;
cin>>r>>c;
--r, --c;
// comprobar la diagonal
if(cnt1[r][c] && cnt2[r][c]){ // candidato
int x = min(c, n-r-1);
int i = r+x, j = c-x;
x = 0;
while(i >= 0 && j < n){
if(cnt1[i][j] && cnt2[i][j]) ++x;
--i, ++j;
}
if(x == 1){ // solo yo
cout<<"0\n";
} else{
erase(r, c);
cout<<"1\n";
}
} else{
erase(r, c);
cout<<"1\n";
}
//~ DBG(cnt1);
//~ DBG(cnt2);
}
return 0;
}