#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define maxn 310
#define maxq 20010
struct punct
{
long x;
long y;
long id;
};
struct querry
{
punct p1;
punct p2;
long id;
long val;
};
long n, i, j, k, poz, q, l, p1, p2, put;
punct p[maxn*maxn];
querry w[maxq];
long tata[maxn*maxn], ok[maxn*maxn], sol[maxq];
long m[maxn][maxn], ind[maxn][maxn], fol[maxn][maxn];
const long d1[]={0, -1, 0, 1};
const long d2[]={-1, 0, 1, 0};
inline int cmp(punct a, punct b)
{
return m[a.x][a.y]>m[b.x][b.y];
}
inline int cmp2(querry a, querry b)
{
return a.val>b.val;
}
void c_conexe()
{
long i, j, x, y, xx, yy, nod, aux, pq, pz, tata1, tata2;
memset(fol, 0, sizeof(fol));
for(i=1; i<=n*n; i++)
{
tata[i]=i;
}
pq=1;
for(i=1; i<=n*n; i++)
{
pz=i;
while(m[p[pz].x][p[pz].y]==m[p[i].x][p[i].y] && pz<=n*n)
{
// printf("%d ", pz);
// printf("%d %d\n", p[pz].x, p[pz].y);
fol[p[pz].x][p[pz].y]=1;
for(j=0; j<4; j++)
{
xx=(p[pz].x)+d1[j];
yy=(p[pz].y)+d2[j];
if(xx && yy && xx<=n && yy<=n && fol[xx][yy])
{
nod=ind[xx][yy];
while(tata[nod]!=nod)
{
aux=tata[nod];
tata[nod]=p[pz].id;
nod=aux;
}
tata[nod]=p[pz].id;
}
}
pz++;
}
/* for(x=1; x<=n; x++)
{
for(y=1; y<=n; y++)
{
nod=(x-1)*n+y;
while(tata[nod]!=nod)
{
nod=tata[nod];
}
printf("%d ", fol[x][y]);
}
printf("\n");
}*/
while(w[pq].val+(1<<put)>=m[p[i].x][p[i].y] && pq<=q)
{
tata1=ind[w[pq].p1.x][w[pq].p1.y];
while(tata[tata1]!=tata1)
{
tata1=tata[tata1];
}
tata2=ind[w[pq].p2.x][w[pq].p2.y];
while(tata[tata2]!=tata2)
{
tata2=tata[tata2];
}
// printf("%d %d\n", tata1, tata2);
if(tata1==tata2)
{
ok[pq]=1;
}
pq++;
}
i=pz-1;
}
// printf("\n");
}
int main()
{
freopen("matrice2.in", "r", stdin);
freopen("matrice2.out", "w", stdout);
scanf("%d%d", &n, &q);
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
scanf("%d", &m[i][j]);
poz=(i-1)*n+j;
ind[i][j]=poz;
p[poz].x=i;
p[poz].y=j;
p[poz].id=poz;
}
}
for(i=1; i<=q; i++)
{
scanf("%d%d%d%d", &w[i].p1.x, &w[i].p1.y, &w[i].p2.x, &w[i].p2.y);
w[i].id=i;
}
sort(p+1, p+n*n+1, cmp);
for(put=3; put>=0; put--)
{
sort(w+1, w+q+1, cmp2);
memset(ok, 0, sizeof(ok));
c_conexe();
for(i=1; i<=q; i++)
{
if(ok[i])
{
w[i].val+=1<<put;
}
}
}
for(i=1; i<=q; i++)
{
sol[w[i].id]=w[i].val;
}
for(i=1; i<=q; i++)
{
printf("%d\n", sol[i]);
}
return 0;
}