#include <bits/stdc++.h>
#include "Project.h"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vc;
typedef vector<vector<int>> matrix;
#define ft(n) for(ull i=1; i<=n; i++)
#define sp ' '
string file = "plantatie";
ifstream f(file + ".in");
ofstream g(file + ".out");
int n, m, logn;
vector<matrix> dp;
void test()
{
for (int k = 0; k <= logn; k++)
{
g << k << endl;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
g << dp[k][i][j] << sp;
g << endl;
}
g << endl;
}
g << endl << endl;
}
void precalc()
{
logn = log2(n);
dp.resize(logn + 1, matrix(n + 5, vc(n + 5, 0)));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
f >> dp[0][i][j]; //2^0 side len
for (int k = 1; k <= logn; k++) //2^k side len
for (int i = 1; i <= n - (1 << k) + 1; i++)
for (int j = 1; j <= n - (1 << k) + 1; j++)
{
int slen = (1 << (k - 1)); //len of the smaller squares' sides
int first2squares = max(dp[k - 1][i][j], dp[k - 1][i][j + slen]);
int last2squares = max(dp[k - 1][i + slen][j], dp[k - 1][i + slen][j + slen]);
dp[k][i][j] = max(first2squares, last2squares);
}
//test();
}
void rmq()
{
int x, y, len; //corner 1 (x, y)
f >> x >> y >> len;
int smk = log2(len); //smaller k
int smlen = 1 << smk; //4 overlapping or touching squares of 2^log2 length
int first2squares = max(dp[smk][x][y], dp[smk][x][y + smk]);
int last2squares = max(dp[smk][x + smk][y], dp[smk][x + smk][y + smk]);
int res = max(first2squares, last2squares);
g << res << "\n";
}
int main()
{
f >> n >> m;
precalc();
for (int i = 1; i <= m; i++)
rmq();
return 0;
}