#include<stdio.h>
#define infile "matrice2.in"
#define outfile "matrice2.out"
#define nmax 313
#define qmax (23*1000)
#define cmax (1000*1013)
const int ii[]={-1,0,1,0};
const int jj[]={0,1,0,-1};
struct lista
{
int x,y,p; //cele doua pozitii pe care le uneste, respectiv pozitia catre urmatoarea muchie cu acelasi cost
} l[(nmax*nmax)<<2]; //lista cu muchiile .... pe costuri
struct query
{
int x,y; //valorile pentru pozitia de start repsectiv sfarsit
int r; //raspunsul la query
} a[qmax]; //query-urile
int c[cmax]; //pozitia catre lista pentru fiecare cost
int d[nmax*nmax]; //vectorul unde tinem paduri de multimi disjuncte
int e[qmax]; //query-urile ce le mai avem de rezolvat
int m[nmax][nmax]; //valorile din matrice
int n; //dimensiunea mtricei patratice
int q; //numarul de query-uri
int nrl; //numarul de elemente din lista
int valmax; //valoarea maxima a unei muchii
inline int min(int a, int b)
{
if(a<b) return a; return b;
}
inline int max(int a, int b)
{
if(a>b) return a; return b;
}
inline int poz(int x, int y)
{
return (x-1)*n+y;
}
inline void push(int nr, int x, int y, int z)
{
valmax=max(valmax,z), l[nr].x=x, l[nr].y=y, l[nr].p=c[z], c[z]=nr;
}
int componenta(int x)
{
int y,t=x;
while(d[t]) t=d[t];
while(d[x]) y=d[x],d[x]=t,x=y;
return t;
}
void unit(int x, int y)
{
if(componenta(x)!=componenta(y))
d[componenta(x)]=componenta(y);
}
void read()
{
int i,j,x1,y1,x2,y2;
scanf("%d %d\n",&n,&q);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&m[i][j]);
for(i=1;i<=q;i++)
{
scanf("%d %d %d %d\n",&x1,&y1,&x2,&y2);
a[i].x=poz(x1,y1), a[i].y=poz(x2,y2);
}
}
void init()
{
int i,j,k;
//initializam muchiile sortate
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=0;k<4;k++)
if(i+ii[k]>0 && i+ii[k]<=n && j+jj[k]>0 && j+jj[k]<=n)
push(++nrl,poz(i,j),poz(i+ii[k],j+jj[k]),min(m[i][j],m[i+ii[k]][j+jj[k]]));
//initializam vectorul e
for(i=1;i<=q;i++) e[i]=i;
}
void solve()
{
int i,j,k;
for(i=valmax,j=q;i>0&&j>0;i--)
if(c[i])
{
for(k=c[i];k;k=l[k].p)
unit(l[k].x,l[k].y);
for(k=1;k<=j;k++)
if(componenta(a[e[k]].x)==componenta(a[e[k]].y))
a[e[k]].r=i,e[k--]=e[j--];
}
}
void write()
{
int i;
for(i=1;i<=q;i++)
printf("%d\n",a[i].r);
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
read();
init();
solve();
write();
fclose(stdin);
fclose(stdout);
return 0;
}