#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 305 * 305;
int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0 ,- 1};
int a[305][305], n, m, RG[N], T[N], v[N];
struct tip {int v, i, j, nod;} c[N], q[N], st[20005], fin[20005];
int cmp(tip a, tip b) {
return a.v > b.v;
}
int cmp2(tip a, tip b) {
return a.i > b.i;
}
int find(int x) {
int R, y;
for(R = x; R != T[R]; R = T[R]);
// printf("%d %d\n", R, x);
for(;x != T[x];) {
y = T[x];
T[x] = R;
x = y;
// printf("%d ", y);
}
// printf("\n");
return R;
}
void unite(int x, int y) {
if(RG[x] > RG[y])
T[y] = x;
else
T[x] = y;
if(RG[x] == RG[y])
++RG[y];
}
void solve() {
sort(c + 1, c + n * n + 1, cmp);
int sw = 1, k , i, p, l, cl, nod;
int nr = 0;
c[0].v = c[1].v + 1;
int step = 1 << 20;
for(;step; step /= 2) {
sw = 0;
++nr;
for(i = 1; i<= m; ++i)
q[i].i += step;
sort(q + 1, q + m + 1, cmp2);
p = 0;
// for(i = 1; i <= n * n; ++i)
// printf("%d ", c[i].v);
// printf("\n");
// for(i = 1; i<= m; ++i)
// printf("%d \n", q[i].i);
// printf("\n");
for(i = 1; i <= n * n; ++i){
RG[i] = 1;
T[i] = i;
v[i] = 0;
}
for(i = 1; i <= m; ++i) {
while(c[p].v >= q[i].i && p <= n * n) {
// printf("%d %d %d\n", c[p].v, c[p].i, c[p].j);
v[c[p].nod] = 1;
for(k = 0; k <= 3; ++k) {
l = c[p].i + dl[k];
cl = c[p].j + dc[k];
if(l <= n && l >= 1 && cl <= n && cl >= 1) {
nod = (l - 1) * n + cl;
// printf("%d %d %d %d\n", l, cl, find(nod), find(c[p].nod));
if(v[nod] && (find(nod) != find(c[p].nod)) )
// printf("%d %d %d %d\n", c[p].i, c[p].j, l, cl),
unite(find(nod), find(c[p].nod));
}
}
++p;
}
// printf("%d %d %d %d\n", st[q[i].v].nod, fin[q[i].v].nod, find(st[q[i].v].nod), find(fin[q[i].v].nod));
if(find(st[q[i].v].nod) == find(fin[q[i].v].nod))
;
else
q[i].i -= step ;
}
}
}
int cmp3(tip a, tip b) {
return a.v < b.v;
}
int main() {
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
int i, j, nr = 0, p = 1 << 20, x, y, X, Y;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j) {
scanf("%d ", &x);
c[++nr].v = x;
c[nr].i = i;
c[nr].j = j;
c[nr].nod = (i - 1) * n + j;
}
for(i = 1; i <= m; ++i) {
scanf("%d %d %d %d", &x, &y, &X, &Y);
q[i].v = i;
q[i].i = 0;
st[i].nod = (x - 1) * n + y;
fin[i].nod = (X - 1) * n + Y;
}
solve();
sort(q + 1, q + m + 1, cmp3);
for(i = 1; i <= m; ++i)
printf("%d \n", q[i].i);
return 0;
}