#include<stdio.h>
#include<algorithm>
#define M 90010
using namespace std;
int n,q,p,i,j,m,a[M],U[M],D[M],L[M],R[M],f[M],s[M],v[M],b[M],c[M],
val,root,co[M],lc,Q[M],vec,dad[M],sol[M],l,pr,ul,k,
ca(int p1,int p2),cv(int p1,int p2);
void read(),solve(),Graph();
int main()
{
read();
solve();
return 0;
}
void read()
{
int x,y;
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
scanf("%d%d",&n,&q);m=n*n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
p++;scanf("%d",&a[p]);b[p]=p;
}
for(i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
f[i]=(x-1)*n+y;
scanf("%d%d",&x,&y);
s[i]=(x-1)*n+y;
v[i]=a[f[i]]<a[s[i]]?a[f[i]]:a[s[i]];
c[i]=i;
}
}
void solve()
{
Graph();
sort(b+1,b+m+1,ca);
sort(c+1,c+q+1,cv);
pr=1;ul=0;k=1;
for(i=1;i<=m;i++)
{
val=a[b[i]];
while(a[b[i]]==val)
{
root=b[i];lc=1;co[1]=b[i];
vec=U[b[i]];
if(dad[vec])
for(;;)
{
co[++lc]=vec;
if(dad[vec]==vec)
{
root=(root<vec)?root:vec;break;
}
vec=dad[vec];
}
vec=D[b[i]];
if(dad[vec])
for(;;)
{
co[++lc]=vec;
if(dad[vec]==vec)
{
root=(root<vec)?root:vec;break;
}
vec=dad[vec];
}
vec=L[b[i]];
if(dad[vec])
for(;;)
{
co[++lc]=vec;
if(dad[vec]==vec)
{
root=(root<vec)?root:vec;break;
}
vec=dad[vec];
}
vec=R[b[i]];
if(dad[vec])
for(;;)
{
co[++lc]=vec;
if(dad[vec]==vec)
{
root=(root<vec)?root:vec;break;
}
vec=dad[vec];
}
for(j=1;j<=lc;j++)dad[co[j]]=root;
i++;
}
i--;
while(v[c[k]]==val)
{
Q[++ul]=c[k++];
}
for(j=pr;j<=ul;j++)
{
vec=f[Q[j]];lc=1;co[1]=vec;
for(;;){if(vec==dad[vec])break;vec=dad[vec];co[++lc]=vec;}
for(l=1;l<=lc;l++)dad[co[l]]=vec;
vec=s[Q[j]];lc=1;co[1]=vec;
for(;;){if(vec==dad[vec])break;vec=dad[vec];co[++lc]=vec;}
for(l=1;l<=lc;l++)dad[co[l]]=vec;
if(dad[f[Q[j]]]==dad[s[Q[j]]]){sol[Q[j]]=val;Q[j]=Q[pr];pr++;}
}
}
for(i=1;i<=q;i++)printf("%d\n",sol[i]);
}
void Graph()
{
int nn=n*n-n;
for(i=0;i<=nn;i+=n)for(j=1;j<n;j++){R[i+j]=i+j+1;L[i+j+1]=i+j;}
for(i=1;i<=nn;i++){D[i]=i+n;U[i+n]=i;}
}
int ca(int p1,int p2)
{
if(a[p1]>a[p2])return 1;return 0;
}
int cv(int p1,int p2)
{
if(v[p1]>v[p2])return 1;return 0;
}