#include <cstdio>
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define MAX 501
long A[MAX][MAX];
long T[4*MAX*MAX];
long N, M, max=0;
void constr(long i, long x1, long y1, long x2, long y2) {
if ( i>max )
max = i;
if (x1==x2 && y1==y2) {
T[i] = A[x1][y1]; return;
}
long mx = (x1+x2)/2;
long my = (y1+y2)/2;
if ( x1==x2 ) {
constr(4*i+1, x1,y1,x1,my);
constr(4*i+2, x1,my+1,x2,y2);
T[4*i+3] = T[4*i+1];
T[4*i+4] = T[4*i+2];
return;
}
if ( y1==y2 ) {
constr(4*i+1, x1,y1,mx,y1);
constr(4*i+3, mx+1,y1,x2,y1);
T[4*i+2] = T[4*i+1];
T[4*i+4] = T[4*i+3];
return;
}
constr(4*i+1, x1,y1,mx,my);
constr(4*i+2, x1,my+1,mx,y2);
constr(4*i+3, mx+1,y1,x2,my);
constr(4*i+4, mx+1,my+1,x2,y2);
T[i] = 0; long j;
for (j=1; j<=4; ++j)
if (T[i]<T[4*i+j])
T[i] = T[4*i+j];
}
long px1,px2,py1,py2, V[4];
long divide(long i, long x1,long y1, long x2,long y2) {
if ( px1<=x1 && py1<=y1 && x2<=px2 && y2<=py2 )
return T[i];
long mx = (x1+x2) / 2;
long my = (y1+y2) / 2;
long max=0; for(long j=0; j<4; ++j) V[j]=0;
if ( mx>=px1 ) {
if ( my>=py1 )
V[0] = divide(4*i+1, x1,y1, mx, my);
if ( my<py2 )
V[1] = divide(4*i+2, x1,my+1, mx, y2);
}
if ( mx<px2 ) {
if (my>=py1)
V[2] = divide(4*i+3, mx+1, y1, x2, my);
if (my<py2)
V[3] = divide(4*i+4, mx+1,my+1,x2,y2);
}
for (long j=0; j<4; ++j)
max=(max<V[j]) ? V[j] : max;
return max;
}
int main() {
long i,j, x,y,z;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%ld %ld", &N, &M);
for (i=1; i<=N; ++i)
for (j=1; j<=N; ++j)
scanf("%ld", A[i]+j);
constr(0,1,1,N,N);
for (i=0; i<M; ++i) {
scanf("%ld %ld %ld", &x, &y, &z);
px1=x;
py1=y;
px2=x+z-1;
py2=y+z-1;
printf("%ld\n", divide(0,1,1,N,N));
}
fclose(stdin);fclose(stdout);
return 0;
}