#include <stdio.h>
#define NMAX 300
void f1(int A[NMAX][NMAX], int B[NMAX][NMAX], int N, int x)
{
int i, j;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
B[i][j] = A[i][j]>=x ? 1 : 0;
}
int f2(int B[NMAX][NMAX], int N, int xc, int yc, int xf, int yf)
{
if(xc==xf && yc==yf)
return 1;
if(xc<0 || xc>=N || yc<0 || yc>=N || !B[xc][yc])
return 0;
B[xc][yc] = 0;
return f2(B, N, xc+1, yc, xf, yf) ||
f2(B, N, xc-1, yc, xf, yf) ||
f2(B, N, xc, yc+1, xf, yf) ||
f2(B, N, xc, yc-1, xf, yf);
}
int main()
{
FILE *fin, *fout;
int i, j, N, Q, A[NMAX][NMAX], B[NMAX][NMAX], x1, y1, x2, y2, max12;
fin = fopen("matrice.in", "rt");
fout = fopen("matrice.out", "wt");
fscanf(fin, "%d %d", &N, &Q);
for(i=0; i<N; i++)
for(j=0; j<N; j++)
fscanf(fin, "%d", &A[i][j]);
for(i=1; i<=Q; i++)
{
fscanf(fin, "%d %d %d %d", &x1, &y1, &x2, &y2);
x1--; y1--; x2--; y2--;
max12 = A[x1][y1]>A[x2][y2] ? A[x1][y1] : A[x2][y2];
for(j=max12; j>=1; j--)
{
f1(A, B, N, j);
if(f2(B, N, x1, y1, x2, y2))
{
fprintf(fout, "%d\n", j);
break;
}
}
}
fclose(fin);
fclose(fout);
return 0;
}