#include <stdio.h>
#include <algorithm>
#define Nmax 302
#define Qmax 20002
using namespace std;
struct father{
int i,j;
inline bool operator !=( const father &o ){
return ( o.i != i || o.j != j );
}
inline bool operator ==( const father &o ){
return ( o.i==i && o.j==j);
}
};
int dx[4]={0,-1,0,1}, dy[4]={-1,0,1,0};
int N,q;
int X1[Qmax],X2[Qmax],Y1[Qmax],Y2[Qmax];
int Q[Qmax],iq[Qmax],sol[Qmax];
father tt[Nmax][Nmax];
int a[Nmax][Nmax],rg[Nmax][Nmax],b[Nmax][Nmax];
int v[Nmax*Nmax],ind[Nmax*Nmax],X[Nmax*Nmax],Y[Nmax*Nmax];
inline father Find( int i,int j){
father r,x,w;
w.i=i; w.j=j;
for( r=w; r != tt[r.i][r.j]; ) r=tt[r.i][r.j];
for( ;w != tt[w.i][w.j]; ){
x=tt[ w.i][ w.j];
tt[ w.i][ w.j] =r;
w=x;
}
return r;
}
inline void Unite( father f1, father f2 ){
if( rg[f1.i][f1.j] > rg[f2.i][f2.j] )
tt[f2.i][f2.j]=f1;
else tt[f1.i][f1.j]=f2;
if( rg[f1.i][f1.j] == rg[f2.i][f2.j] )
rg[f2.i][f2.j]++;
}
inline int bun(int x,int y){
return x>0 && y>0 && x<=N && y<=N && b[x][y];
}
inline int cmp2(int i,int j){
return Q[i] > Q[j];
}
void search(){
int step=1,i,j,v0,ii,k;
while( (step<<1) <= v[ind[1]] ) step<<=1;
for( ; step ; step>>=1){
for(i=1;i<=N;++i)
for(j=1;j<=N;++j) tt[i][j]=(father){i,j}, rg[i][j]=1,b[i][j]=0;
for(i=1;i<=q;++i){
Q[i]=sol[i]+step;
iq[i]=i;
}
sort(iq+1,iq+q+1,cmp2);
for(i=1, j=1;i<=v[0]; ){
for( ; j<=q && Q[iq[j]] > v[ind[i]]; ++j )
if( Find( X1[iq[j]],Y1[iq[j]] ) == Find( X2[iq[j]],Y2[iq[j]]) )
sol[iq[j]] += step;
for( v0=v[ind[i]] ; v[ind[i]] == v0; ++i ){
ii=ind[i]; b[X[ii]][Y[ii]]=1;
for(k=0; k<4; ++k){
if( bun( X[ii]+dx[k],Y[ii]+dy[k] ) )
if( Find(X[ii],Y[ii]) != Find( X[ii]+dx[k],Y[ii]+dy[k] ) )
Unite( Find(X[ii],Y[ii]) , Find( X[ii]+dx[k],Y[ii]+dy[k] ) );
}
}
}
for( ; j<=q ; ++j )
if( Find( X1[iq[j]],Y1[iq[j]] ) == Find( X2[iq[j]],Y2[iq[j]]) )
sol[iq[j]] += step;
}
}
inline int cmp(int i,int j){
return v[i] > v[j];
}
int main(){
int i,j,x,mx=0;
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",&x),mx=mx > x ? mx:x;
a[i][j]=x;
v[++v[0]]=x;
X[v[0]]=i; Y[v[0]]=j;
ind[v[0]]=v[0];
}
sort(ind+1,ind+v[0]+1,cmp);
for(i=1;i<=q;++i){
scanf("%d%d%d%d",&X1[i],&Y1[i],&X2[i],&Y2[i]);
Q[i]=i;
}
search();
for(i=1;i<=q;++i) printf("%d\n",sol[i]);
fclose(stdin); fclose(stdout);
return 0;
}