#include<stdio.h>
#include<vector>
using namespace std;
FILE*in=fopen("matrice2.in","r");
FILE*out=fopen("matrice2.out","w");
void rezolva(int a,int b,int c,int d);
void parcurgere(int a, int b, int min);
int n,m,xS,yS,xF,yF,maxim,h,rezultat;
int v[301][301];
bool viz[301][301],ajuns;
int main()
{
fscanf(in,"%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
fscanf(in,"%d",&v[i][j]);
if(v[i][j]>maxim)
maxim=v[i][j];
}
for(int i=1;i<=m;++i)
{
fscanf(in,"%d%d%d%d",&xS,&yS,&xF,&yF);
rezolva(xS,yS,xF,yF);
fprintf(out,"%d\n",rezultat);
}
fclose(in);
fclose(out);
return 0;
}
void rezolva(int a,int b,int c,int d)
{
h=rezultat=0;
while(h<=v[xS][yS])
{
if(ajuns)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
viz[i][j]=false;
}
ajuns=false;
parcurgere(a,b,maxim);
++h;
}
}
void parcurgere(int a,int b,int min)
{
viz[a][b]=true;
if(a!=xF || b!=yF)
{
if(v[a+1][b] && v[a+1][b] > h && !viz[a+1][b])
{
if(min>v[a+1][b])
min=v[a+1][b];
parcurgere(a+1,b,min);
}
if(v[a][b+1] && v[a][b+1] > h && !viz[a][b+1])
{
if(min>v[a][b+1])
min=v[a][b+1];
parcurgere(a,b+1,min);
}
if(v[a-1][b] && v[a-1][b] > h && !viz[a-1][b])
{
if(min>v[a-1][b])
min=v[a-1][b];
parcurgere(a-1,b,min);
}
if(v[a][b-1] && v[a][b-1] > h && !viz[a][b-1])
{
if(min>v[a][b-1])
min=v[a][b-1];
parcurgere(a,b-1,min);
}
}
else
{
h=min;
rezultat=min;
ajuns=true;
}
}