#include <cstdio>
#include <algorithm>
#define NMAX 20007
#define MMAX 307
using namespace std;
struct elem {
int x, y, val ;
};
struct elem2{
int x1, x2;
int y1, y2;
int ind;
int Ans;
};
elem a[MMAX * MMAX];
elem2 q[NMAX];
int dad[MMAX * MMAX], H[MMAX * MMAX];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, -1, 1};
int n, m;
bool Cmp1(elem a, elem b){
return a.val > b.val ;
}
bool Comp2(elem2 a, elem2 b){
return a.Ans > b.Ans ;
}
bool Cmp3(elem2 a, elem2 b){
return a.ind < b.ind ;
}
int code(int a, int b){
return (a - 1) * n + b;
}
elem2 make_elem(int X1, int Y1, int X2 , int Y2 , int Ind){
elem2 a;
a.x1 = X1;
a.y1 = Y1;
a.x2 = X2;
a.y2 = Y2;
a.ind = Ind;
a.Ans = 0;
return a;
}
inline int Find ( int Nod ){
int R = Nod ;
for(; dad[R] != R; R = dad[R]);
while(Nod != dad[Nod]){
int aux = dad[Nod];
dad[Nod] = R;
Nod = aux;
}
return R;
}
inline void unite(int a , int b){
a = Find(a);
b = Find(b);
if(a == b)
return ;
if(H[a] > H[b]){
H[a] += H[b];
dad[b] = a;
}
else{
H[b] += H[a];
dad[a] = b;
}
}
void solve(int x, int y, int n){
dad[code(x,y)] = code(x, y);
for(int i = 0; i <= 3; ++i){
int Nodx = x + dx[i];
int Nody = y + dy[i];
if(dad[code(Nodx, Nody)] == 0)
continue ;
unite(code(Nodx, Nody), code(x, y));
}
}
int main(){
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1 ; i <= n; ++i)
for(int j = 1; j <= n; ++j){
a[code(i, j)].x = i;
a[code(i, j)].y = j;
scanf("%d", &a[code(i, j)].val);
}
for(int i = 1; i <= m; ++i){
int X1, Y1, X2, Y2;
scanf("%d %d %d %d", &X1, &Y1, &X2, &Y2);
q[i] = make_elem(X1, Y1, X2, Y2, i);
}
sort(a + 1, a + n * n + 1, Cmp1);
for(int i = 30; i >= 0; --i){
for(int j = 1; j <= n * n; ++j){
dad[j] = 0;
H[j] = 1;
}
sort(q + 1, q + m + 1, Comp2);
int Ind = 1;
for(int j = 1; j <= m; ++j){
for ( ; q[j].Ans + (1 << i) <= a[Ind].val && Ind <= n * n; ++Ind)
solve(a[Ind].x, a[Ind].y, n);
int colt1 = Find(code(q[j].x1, q[j].y1));
int colt2 = Find(code(q[j].x2, q[j].y2));
if(colt1 == colt2 && colt1 && colt2)
q[j].Ans += (1 << i);
}
}
sort(q + 1, q + m + 1, Cmp3);
for(int i = 1; i <= m; ++i)
printf("%d\n", q[i].Ans);
return 0;
}