#include <cstdio>
#include <algorithm>
using namespace std;
const int nmx = 302, qst = 20002;
const int p1[] = {0,0,1,-1}, p2[] = {1,-1,0,0};
struct nod
{
int i,j;
} v[nmx*nmx];
struct question
{
int x1,y1,x2,y2;
} qs[qst];
int n,m,mat[nmx][nmx],ans[qst];
int tata[nmx*nmx],rang[nmx*nmx];
struct Cmp
{
bool operator() (nod n1, nod n2)
{
return mat[n1.i][n1.j] > mat[n2.i][n2.j];
}
} cmp;
int poz(int i, int j)
{
return (i - 1) * n + j;
}
void citire()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
{
scanf("%d", &mat[i][j]);
int p = poz(i,j);
v[p].i = i;
v[p].j = j;
}
for(int i = 1; i <= m; ++i)
scanf("%d %d %d %d", &qs[i].x1, &qs[i].y1, &qs[i].x2, &qs[i].y2);
}
void reset_paduri()
{
for(int i = 1; i <= n * n; ++i)
{
tata[i] = i;
rang[i] = 1;
}
}
int da_grupa(int ni)
{
int naux = ni;
while(tata[naux] != naux)
naux = tata[naux];
int naux2;
while(ni != tata[ni])
{
naux2 = tata[ni];
tata[ni] = naux;
ni = naux2;
}
return naux;
}
void uneste(int n1, int n2)
{
if(rang[n1] > rang[n2])
tata[n2] = n1;
else
tata[n1] = n2;
if(rang[n1] == rang[n2])
++ rang[n2];
}
bool apartine(int i, int j)
{
return i > 0 && i <= n && j > 0 && j <= n;
}
void uneste_val(int val)
{
reset_paduri();
int p = 1;
while(mat[v[p].i][v[p].j] >= val)
{
for(int q = 0; q < 4; ++q)
if(apartine(v[p].i+p1[q],v[p].j+p2[q]) && mat[v[p].i+p1[q]][v[p].j+p2[q]] >= val)
{
int g1 = da_grupa(poz(v[p].i,v[p].j));
int g2 = da_grupa(poz(v[p].i+p1[q],v[p].j+p2[q]));
if(g1 != g2)
uneste(g1,g2);
}
++p;
}
}
void cautbin(int st, int dr)
{
int mij = (st + dr) / 2;
uneste_val(mij);
bool ok1 = 0, ok2 = 0;
for(int i = 1; i <= m; ++i)
{
int g1 = da_grupa(poz(qs[i].x1,qs[i].y1));
int g2 = da_grupa(poz(qs[i].x2,qs[i].y2));
if(g1 == g2)
{
if(ans[i] < mij)
{
ok1 = 1;
ans[i] = mij;
}
}
else if(ans[i] >= st - 1)
ok2 = 1;
}
if(ok2)
cautbin(st,mij-1);
if(ok1)
cautbin(mij+1,dr);
}
void afish()
{
for(int i = 1; i <= m; ++i)
printf("%d\n", ans[i]);
}
int main()
{
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
citire();
sort(v+1,v+n*n+1,cmp);
/**for(int i = 1; i < 26; ++i)
printf("%d %d %d\n", v[i].i, v[i].j, mat[v[i].i][v[i].j]);**/
cautbin(1,mat[v[1].i][v[1].j]);
afish();
return 0;
}