#include <fstream>
#define line 1
#define colomn 0
#define inf 1<<30
#define LE 570
using namespace std;
ifstream f ( "plantatie.in" );
ofstream g ( "plantatie.out" );
int i, n, m, j, Xquery, Yquery, result, k, Arb[LE*LE*6], A[LE][LE];
void Push ( int stLinie, int drLinie, int stColoana, int drColoana, int Typ, int Poz )
{
int mijloc = Typ == line ? ( stLinie + drLinie ) / 2 : ( stColoana + drColoana ) / 2;
Arb[Poz] = A[i][j] > Arb[Poz] ? A[i][j] : Arb[Poz];
if (stLinie==drLinie&&stColoana==drColoana) return;
if ( Typ == line )
{
if ( i <= mijloc )
Push ( stLinie, mijloc, stColoana, drColoana, colomn, Poz * 2 );
else Push ( mijloc + 1, drLinie, stColoana, drColoana, colomn, Poz * 2 + 1 );
}
else
{
if ( j <= mijloc )
Push ( stLinie, drLinie, stColoana, mijloc, line, 2 * Poz );
else Push ( stLinie, drLinie, mijloc + 1, drColoana, line, 2 * Poz + 1 );
}
}
///////
void Query ( int stLinie, int drLinie, int stColoana, int drColoana, int Typ, int Poz )
{
int mijloc = Typ == line ? ( stLinie + drLinie ) / 2 : ( stColoana + drColoana ) / 2;
if ( stLinie >= Xquery && drLinie <= Xquery + k && stColoana >= Yquery && drColoana <= Yquery + k )
{
result = result < Arb[Poz] ? Arb[Poz] : result;
return ;
}
if ( Typ == line )
{
if ( Xquery <= mijloc )
Query ( stLinie, mijloc, stColoana, drColoana, colomn, 2 * Poz );
if ( Xquery + k > mijloc )
Query ( mijloc + 1, drLinie, stColoana, drColoana, colomn, 2 * Poz + 1 );
}
else
{
if ( Yquery <= mijloc )
Query ( stLinie, drLinie, stColoana, mijloc, line, 2 * Poz );
if ( Yquery + k > mijloc )
Query ( stLinie, drLinie, mijloc + 1, drColoana, line, 2 * Poz + 1 );
}
}
int main()
{
f >> n >> m;
for ( i = 1; i <= n; ++i )
for ( j = 1; j <= n; ++j )
{
f >> A[i][j];
// Push ( 1, n, 1, n, 1, 1 );
}
for ( i = 1; i <=m; ++i )
{
f >> Xquery >> Yquery >> k;
k--;
result = -inf;
// Query ( 1, n, 1, n, 1, 1 );
for(int I=Xquery; I<=Xquery+k; ++I)
for(int J=Yquery; J<=Yquery+k;++J)
result=A[I][J]>result?A[I][J]:result;
g << result << '\n';
}
f.close();
g.close();
return 0;
}