#include<cstdio>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<bitset>
#include<deque>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<unordered_map>
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
using namespace std;
const int nmax = 305;
const int qmax = 20005;
int n, m, i, j, cnt, step, N, p;
int a[nmax][nmax], code[nmax][nmax];
int f[nmax * nmax], sol[qmax];
bool viz[nmax][nmax];
int dx[] = { -1, 0, 0, 1};
int dy[] = {0, -1, 1, 0};
struct elem
{
int x, y, val;
bool operator < (const elem &A) const
{
return val > A.val;
}
};
elem e[nmax*nmax];
struct query
{
int x1, y1, x2, y2, i, sol;
bool operator < (const query &A) const
{
return sol > A.sol;
}
};
query q[qmax];
int find(int x)
{
if(f[x] != x)
f[x] = find(f[x]);
return f[x];
}
void unite(int x, int y)
{
f[x] = y;
}
void unite_4d(int x, int y)
{
int F = find(code[x][y]);
for(int k = 0; k < 4; k++)
{
int newx = x + dx[k];
int newy = y + dy[k];
if(viz[newx][newy])
unite(find(code[newx][newy]), F);
}
}
int main()
{
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
{
scanf("%d", &a[i][j]);
++cnt;
e[cnt].x = i;
e[cnt].y = j;
e[cnt].val = a[i][j];
code[i][j] = cnt;
}
N = n * n;
for(i = 1; i <= m; i++)
{
scanf("%d%d", &q[i].x1, &q[i].y1);
scanf("%d%d", &q[i].x2, &q[i].y2);
q[i].i = i;
}
sort(e + 1, e + N + 1);
for(step = 1 << 19; step; step >>= 1)
{
memset(viz, 0, sizeof(viz));
for(i = 1; i <= N; i++)
f[i] = i;
sort(q + 1, q + m + 1);
p = 1;
for(i = 1; i <= m; i++)
{
while(p <= N && e[p].val >= q[i].sol + step)
{
viz[e[p].x][e[p].y] = 1;
unite_4d(e[p].x, e[p].y);
p++;
}
int F = find(code[q[i].x1][q[i].y1]);
int G = find(code[q[i].x2][q[i].y2]);
if(F == G)
q[i].sol += step;
}
}
for(i = 1; i <= m; i++)
sol[q[i].i] = q[i].sol;
for(i = 1; i <= m; i++)
printf("%d\n", sol[i]);
return 0;
}