// hdu 1175 #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; struct node { int x , y ; int step ; }s,e; node qu[1100000]; int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int n , m , bx ,by ,ex ,ey; int map[1001][1000]; bool f[1001][1000]; bool flag; bool is_ok(int x, int y) { if( x >=1 && x <= n && y >= 1 && y<= m ) return true; return false; } void bfs() { int head = 0 , tail = 1; s.x = bx ; s.y = by ; s.step = -1; qu[0] = s; f[bx][by] = true; while(head < tail) { s = qu[head++]; int i; for(i=0;i<4;i++) { e.x = s.x + dir[i][0]; e.y = s.y + dir[i][1]; e.step = s.step + 1; // cout<<"s.step is: "<<s.step<<" e.step is:"<<e.step<<endl; // cout<<"s index:"<<s.x<<" "<<s.y<<endl; // cout<<"e index:"<<e.x<<" "<<e.y<<endl; while( is_ok(e.x , e.y) && ( !map[e.x][e.y] ||( e.x == ex && e.y == ey)) ) { if( !f[e.x][e.y] ) { f[e.x][e.y] = true; qu[tail++] = e; if( e.x == ex && e.y == ey && e.step <= 2) { flag = true; return ; } } e.x += dir[i][0]; e.y += dir[i][1]; e.step = s.step + 1; } } } return; } int main() { // freopen("1.txt","r",stdin); while(scanf("%d%d",&n,&m) && n + m) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); int k; scanf("%d",&k); for(int i=0;i<k;i++) { scanf("%d %d %d %d", &bx ,&by , &ex ,&ey); if( map[bx][by] != map[ex][ey] || map[bx][by]==0 ||map[ex][ey]==0) cout << "NO" << endl; else { memset( f, false , sizeof(f)); flag = false; bfs(); if( flag ) cout << "YES" << endl; else cout << "NO" << endl; } } } return 0; }