#include <stdio.h>
#define NMAX 502
int a[NMAX][NMAX][12];
int n, m;
int tmpx;
FILE * fi, *fo;
void read()
{
int i, j;
fscanf(fi, "%d %d ", &n, &m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
{
fscanf(fi, "%d ", &tmpx);
a[i][j][0] = tmpx;
fprintf(stderr, "%d ", tmpx);
}
}
void solve()
{
int i, j, k, aux;
for(k = 1; k <= 9; ++k)
for(i = 1, aux = (1<<(k-1)); i <= n; ++i)
for(j = 1; j <= n; ++j)
{
a[i][j][k] = a[i][j][k-1];
if(i + aux <= n && a[i][j][k] < a[i + aux][j][k-1])
a[i][j][k] = a[i + aux][j][k-1];
if(j + aux <= n && a[i][j][k] < a[i][j + aux][k-1])
a[i][j][k] = a[i][j + aux][k-1];
if(j + aux <= n && i + aux <= n && a[i][j][k] < a[i + aux][j + aux][k-1])
a[i][j][k] = a[i + aux][j + aux][k-1];
}
}
void query()
{
int max, i, x, y, z, p, p2;
int pow[NMAX], pow2[NMAX];
for(pow[0] = pow[1] = 1, pow2[1] = pow2[0] = 0, i = 2; i < NMAX; ++i)
if(pow[i-1]*2 <= i)
pow[i] = pow[i-1]*2, pow2[i] = 1+pow2[i-1];
else
pow[i] = pow[i-1], pow2[i] = pow2[i-1];
for(i = 0; i < m; ++i)
{
fscanf(fi, "%d ", &tmpx);
x = tmpx;
fprintf(stderr, "%d ", tmpx);
fscanf(fi, "%d ", &tmpx);
y = tmpx;
fprintf(stderr, "%d ", tmpx);
fscanf(fi, "%d ", &tmpx);
z = tmpx;
fprintf(stderr, "%d ", tmpx);
p2 = pow[z];
p = pow2[z];
max = a[x][y][p];
if(x+z-p2 > 0 && x+z-p2 <= n && a[x+z-p2][y][p] > max)
max = a[x+z-p2][y][p];
if(y+z-p2 > 0 && y+z-p2 <= n && a[x][y+z-p2][p] > max)
max = a[x][y+z-p2][p];
if(x+z-p2 > 0 && x+z-p2 <= n && y+z-p2 > 0 && y+z-p2 <= n && a[x+z-p2][y+z-p2][p] > max)
max = a[x+z-p2][y+z-p2][p];
fprintf(fo, "%d\n", max);
}
}
void print()
{
int i, j, k;
for(k = 0; k <= 5; ++k)
{
printf("pentru k = %d\n", k);
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= n; ++j)
printf("%d ", a[i][j][k]);
printf("\n");
}
printf("\n");
}
}
int main()
{
int i, j, k;
// freopen("plantatie.in", "r", stdin);
// freopen("plantatie.out", "w", stdout);
fi = fopen("plantatie.in", "r");
fo = fopen("plantatie.out", "w");
read();
solve();
// print();
query();
return 0;
}