# include <algorithm>
# include <cstdio>
using namespace std;
const char *FIN = "matrice2.in", *FOU = "matrice2.out";
const int MAX_N = 305, MAX_X = 90005, MAX_Q = 20005;
const int dx[] = {-1, 0, 1, 0},
dy[] = { 0, 1, 0, -1};
int N, Q, L, cnt;
int dp[MAX_N][MAX_N], X[MAX_X], Y[MAX_X], M[MAX_X], P[MAX_X], G[MAX_X], sol[MAX_Q], pp[MAX_Q], p[MAX_Q];
int X1[MAX_Q], Y1[MAX_Q], X2[MAX_Q], Y2[MAX_Q];
char B[MAX_N][MAX_N];
inline bool comp (int x, int y) {
return M[x] > M[y];
}
inline bool comp2 (int x, int y) {
return pp[x] > pp[y];
}
inline int search (int X) {
if (X != G[X]) G[X] = search (G[X]);
return G[X];
}
int main (void) {
freopen (FIN, "r", stdin);
freopen (FOU, "w", stdout);
scanf ("%d %d", &N, &Q);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
dp[i][j] = ++L, X[L] = i, Y[L] = j, scanf ("%d", M + L), P[L] = L;
for (int i = 1; i <= Q; ++i)
scanf ("%d %d %d %d", X1 + i, Y1 + i, X2 + i, Y2 + i);
sort (P + 1, P + L + 1, comp);
for (cnt = 1; cnt < M[P[1]]; cnt <<= 1);
for (; cnt; cnt >>= 1) {
for (int i = 1; i <= Q; ++i) {
pp[i] = sol[i] + cnt;
p[i] = i;
}
sort (p + 1, p + Q + 1, comp2);
for (int i = 1; i <= L; ++i)
G[i] = i;
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= N; ++j)
B[i][j] = 0;
int j = 1;
for (int i = 1; i <= L; ) {
for (int k = j; j <= Q && pp[p[j]] > M[P[i]]; ++j)
if (search (dp[X1[p[j]]][Y1[p[j]]]) == search (dp[X2[p[j]]][Y2[p[j]]]))
sol[p[j]] += cnt;
for (int k = i; i <= L && M[P[i]] == M[P[k]]; ++i) {
B[X[P[i]]][Y[P[i]]] = 1;
for (int l = 0; l < 4; ++l) {
int recx = X[P[i]] + dx[l], recy = Y[P[i]] + dy[l];
if (recx > 0 && recy > 0 && recx <= N && recy <= N && B[recx][recy])
G[G[search (dp[recx][recy])]] = G[P[i]];
}
}
}
for (; j <= Q; ++j)
if (search (dp[X1[p[j]]][Y1[p[j]]]) == search (dp[X2[p[j]]][Y2[p[j]]]))
sol[p[j]] += cnt;
}
for (int i = 1; i <= Q; ++i)
printf ("%d\n", sol[i]);
}