#include <cstdio>
#include <algorithm>
#include <cstring>
#define maxn 510
using namespace std;
struct pozitie {
int x, y, nr;
};
struct query {
int x1, y1, x2, y2, l, r, ct;
};
const int dl[4] = {0, 0, 1, -1};
const int dc[4] = {1, -1, 0, 0};
int n, i, j, nr, nrq, ind, d, lnou, cnou, ok, dx, xxx, mn;
int bine[20100];
int v[maxn][maxn], cpoz[maxn][maxn];
query q[20100];
int l[20100], r[20100];
pozitie x[maxn * maxn];
int p[maxn * maxn], m[maxn];
int rez[20100];
bool cmp(pozitie a, pozitie b) {
if (a.nr > b.nr)
return true;
return false;
}
bool cmp2(query a, query b) {
if (a.l > b.l)
return true;
return false;
}
int tata(int t) {
if (t == -1)
return -1;
if (p[t] == t)
return t;
p[t] = tata(p[t]);
return p[t];
}
int main() {
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
mn = 2000000000;
scanf("%d%d", &n, &nrq);
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) {
scanf("%d", &v[i][j]);
mn = min(v[i][j], mn);
nr++;
x[nr].x = i; x[nr].y = j;
x[nr].nr = v[i][j];
}
sort(x + 1, x + nr + 1, cmp);
for (i = 1; i <= nr; i++)
cpoz[x[i].x][x[i].y] = i;
for (i = 1; i <= nrq; i++) {
scanf("%d%d%d%d", &q[i].x1, &q[i].y1, &q[i].x2, &q[i].y2);
q[i].l = 0;
q[i].ct = i;
}
ok = 1;
for (xxx = 20; xxx >= 0; xxx--) {
sort(q + 1, q + nrq + 1, cmp2);
for (i = 1; i <= nrq; i++)
m[i] = (q[i].l + (1 << xxx));
memset(p, -1, sizeof(p));
memset(bine, 0, sizeof(bine));
i = 1; ind = 1;
while (i <= nr) {
while (m[ind] > x[i].nr && ind <= nrq) {
if (tata(cpoz[q[ind].x1][q[ind].y1]) == tata(cpoz[q[ind].x2][q[ind].y2]) && tata(cpoz[q[ind].x1][q[ind].y1]) != -1)
bine[ind] = 1;
ind++;
}
j = i;
while (x[i].nr == x[j].nr && j <= nr) {
p[j] = j;
for (d = 0; d < 4; d++) {
lnou = x[j].x + dl[d];
cnou = x[j].y + dc[d];
if (lnou > 0 && lnou <= n && cnou > 0 && cnou <= n && p[cpoz[lnou][cnou]] != -1)
p[tata(cpoz[lnou][cnou])] = j;
}
j++;
}
i = j;
}
while (m[ind] > x[i].nr && ind <= nrq) {
if (tata(cpoz[q[ind].x1][q[ind].y1]) == tata(cpoz[q[ind].x2][q[ind].y2]) && tata(cpoz[q[ind].x1][q[ind].y1]) != -1)
bine[ind] = 1;
ind++;
}
for (i = 1; i <= nrq; i++)
if (bine[i])
q[i].l = (q[i].l + (1 << xxx));
}
for (i = 1; i <= nrq; i++) {
if (q[i].l == 0)
q[i].l = 0;
rez[q[i].ct] = q[i].l;
}
for (i = 1; i <= nrq; i++)
printf("%d\n", rez[i]);
return 0;
}