#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int stop,fin,prec,x1,y1,x2,y2,v1,v2,po,val,nr,i,j,k,n,Q,ras[20013],cod[309][309],t[90009],adev[90009],x[20013],y[20013],how[20013];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
char sir[300*8+10];
vector < int > v[90009],init;
vector < int > ::iterator itt;
struct str
{
int v,p;
};
str a[90009];
bool cmp(str a,str b)
{
return a.v<b.v;
}
int tata(int x)
{
if(t[x]!=x) t[x]=tata(t[x]);
return t[x];
}
void ok(int val,vector < int > vv)
{
memset(t,0,sizeof(t));
for(i=1;a[i].v>=val&&i<=nr;i++)
t[a[i].p]=a[i].p;
for(i=1;a[i].v>=val&&i<=nr;i++)
for(itt=v[a[i].p].begin();itt!=v[a[i].p].end();itt++)
if(tata(*itt)!=tata(a[i].p)&&tata(*itt)!=0) t[tata(a[i].p)]=*itt;
for(itt=vv.begin();itt!=vv.end();itt++)
{
x1=tata(x[*itt]);
y1=tata(y[*itt]);
if(x1==y1&&x1!=0)
{
how[*itt]=1;
ras[*itt]=val;
}
else how[*itt]=0;
}
}
void bs(int st,int dr,vector < int > vv)
{
if(st>dr) return ;
vector < int > hh[2];
int mij=(st+dr)>>1;
ok(mij,vv);
for(itt=vv.begin();itt!=vv.end();itt++)
hh[how[*itt]].push_back(*itt);
bs(st,mij-1,hh[0]);
bs(mij+1,dr,hh[1]);
}
int main()
{
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
scanf("%d",&n);
scanf("%d\n",&Q);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
nr++;
cod[i][j]=nr;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=0;k<4;k++)
if(cod[i+dx[k]][j+dy[k]]!=0) v[cod[i][j]].push_back(cod[i+dx[k]][j+dy[k]]);
nr=0;
for(i=1;i<=n;i++)
{
gets(sir+1);
po=1;
for(j=1;j<=n;j++)
{
val=0;
while(sir[po]>='0'&&sir[po]<='9')
{
val=val*10+sir[po]-48;
po++;
}
nr++;
a[nr].p=nr;
a[nr].v=val;
po++;
}
}
for(i=1;i<=Q;i++)
{
scanf("%d",&x1);
scanf("%d",&y1);
scanf("%d",&x2);
scanf("%d",&y2);
x[i]=cod[x1][y1];
y[i]=cod[x2][y2];
}
sort(a+1,a+nr+1,cmp);
val=0;
prec=0;
for(i=1;i<=nr;i++)
{
if(a[i].v!=prec) val++;
prec=a[i].v;
adev[val]=a[i].v;
a[i].v=val;
}
reverse(a+1,a+nr+1);
for(i=1;i<=Q;i++)
init.push_back(i);
bs(1,val,init);
for(i=1;i<=Q;i++)
printf("%d\n",adev[ras[i]]);
return 0;
}