#include <cstdio>
#include <utility>
#include <algorithm>
using namespace std;
pair <int,int> f[20004],v[90004];
int n,q,i,j,x,y,z,t,m,nr,a[20004],b[20004],c[20004],d[20004],s[20004],p[90004],r[90004],e[304][304];
int nr1 (int x, int y)
{
int z;
z=(x-1)*n;
z+=y;
return z;
}
int pr (int x)
{
while (x!=p[x])
x=p[x];
return x;
}
void ve (int x, int y)
{
z=nr1(x,y);
z=pr(z);
t=pr(t);
if (z!=t)
{
if (r[z]>r[t])
p[t]=z;
else if (r[z]<r[t])
p[z]=t;
else
{
p[t]=z;
r[z]++;
}
}
return;
}
void u (int x)
{
y=(x-1)%n;
y++;
x-=y;
x/=n;
x++;
t=nr1(x,y);
if (e[x-1][y]>e[x][y])
ve(x-1,y);
if (e[x][y-1]>e[x][y])
ve(x,y-1);
if (e[x][y+1]>=e[x][y])
ve(x,y+1);
if (e[x+1][y]>=e[x][y])
ve(x+1,y);
return;
}
int main()
{
freopen ("matrice2.in","r",stdin);
freopen ("matrice2.out","w",stdout);
scanf ("%d %d", &n, &q);
nr=0;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf ("%d", &e[i][j]);
v[++nr].first=e[i][j];
v[nr].second=nr;
}
sort (v+1,v+nr+1);
reverse (v+1,v+nr+1);
for (i=1;i<=q;i++)
{
scanf ("%d %d %d %d", &a[i], &b[i], &c[i], &d[i]);
s[i]=0;
}
m=1<<19;
while (m>=1)
{
for (i=1;i<=q;i++)
{
f[i].first=s[i]+m;
f[i].second=i;
}
for (i=1;i<=nr;i++)
{
p[i]=i;
r[i]=1;
}
sort (f+1,f+q+1);
reverse (f+1,f+q+1);
j=1;
for (i=1;i<=q;i++)
{
while ((v[j].first>=f[i].first) && (j<=nr))
{
u(v[j].second);
j++;
}
z=f[i].second;
x=nr1(a[z],b[z]);
y=nr1(c[z],d[z]);
x=pr(x);
y=pr(y);
if (x==y)
s[z]+=m;
}
m/=2;
}
for (i=1;i<=q;i++)
printf ("%d\n", s[i]);
return 0;
}