#include<cstdio>
#include<string.h>
long mat[305][305],din[305][305],n,q,cx[90005],cy[90005],cv[90005],csel[90005],cs,ce,done,dsel[305][305];
int crdx[]={1,-1,0,0};
int crdy[]={0,0,1,-1};
inline int valid(int nr)
{
if(nr<1)return 0;
else if(nr>n)return 0;
else return 1;
}
void fill(int x,int y,int wx,int wy)
{
int i,nx,ny;
if(x==wx&&y==wy||done){done=1;return;}
for(i=0;i<4;i++)if(valid(crdx[i]+x)&&valid(crdy[i]+y)&&!dsel[crdx[i]+x][crdy[i]+y])
{
nx=crdx[i]+x;
ny=crdy[i]+y;
dsel[nx][ny]=1;
if(din[nx][ny]>din[x][y])
{
din[nx][ny]=din[x][y];
fill(nx,ny,wx,wy);
}
else
{
//addq(nx,ny);
ce++;
cv[ce]=din[nx][ny];
cx[ce]=nx;
cy[ce]=ny;
}
}
}
void rezolva(int x1,int y1,int x2,int y2)
{
int max,maxp,i;
memmove(din,mat,sizeof(mat));
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
memset(csel,0,sizeof(csel));
memset(dsel,0,sizeof(dsel));
done=cs=ce=0;
cx[0]=x1;
cy[0]=y1;
cv[0]=din[x1][y1];
while(cs<=ce)
{
max=0;
for(i=0;i<=ce;i++)if(!csel[i])
if(cv[i]>max){maxp=i;max=cv[i];}
csel[maxp]=1;
fill(cx[maxp],cy[maxp],x2,y2);
if(done)return;
cs++;
}
}
int main()
{
int i,j,x1,x2,y1,y2;
freopen("matrice2.in","r",stdin);
freopen("matrice2.out","w",stdout);
scanf("%ld %ld",&n,&q);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)scanf("%ld",&mat[i][j]);
while(q--)
{
scanf("%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
rezolva(x1,y1,x2,y2);
printf("%ld\n",din[x2][y2]);
}
return 0;
}