#include <cstdio>
#include <queue>
using namespace std;
#define DIM 301
#define mp make_pair
const int vi[] = {-1, 0, 1, 0}, vj[]={0, 1, 0, -1};
int a[DIM][DIM], q, n, c[DIM][DIM], hmax, hmin = 1<<30;
inline int max(const int &a, const int &b)
{
return a<b?b:a;
}
inline int min(const int &a, const int &b)
{
return a<b?a:b;
}
void clean()
{
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
c[i][j] = 0;
}
bool lee(int is, int js, int ig, int jg, int h)
{
if (a[is][js] < h)
return false;
queue<pair<int, int> >Q;
// clean();
Q.push(mp(is, js));
while (!Q.empty())
{
int i = Q.front().first, j = Q.front().second;
Q.pop();
for (int d = 0; d < 4; ++d)
{
int im = i + vi[d], jm = j + vj[d];
if (im < 1 || im > n || jm < 1 || jm > n) continue;
if (a[im][jm] < h) continue;
if (im == ig && jm == jg)
return true;
Q.push(mp(im, jm));
}
}
return false;
}
void solve()
{
FILE *f = fopen("matrice2.in", "r"), *out = fopen("matrice2.out", "w");
fscanf(f, "%d%d", &n, &q);
for (int i = 1;i <= n; ++i)
for (int j = 1; j <= n; ++j)
fscanf(f, "%d", &a[i][j]), hmax = max(hmax, a[i][j]), hmin = min(hmin, a[i][j]);
for (int i1, i2, j1, j2;q;--q)
{
fscanf(f, "%d%d%d%d", &i1, &j1, &i2, &j2);
for (int h = hmax; h >= hmin; --h)
if(lee(i1, j1, i2, j2, h))
{
fprintf(out, "%d\n", h);
break;
}
}
fclose(f);
fclose(out);
}
int main()
{
solve();
return 0;
}