Pagini recente » Cod sursa (job #2552703) | Cod sursa (job #479149) | Cod sursa (job #2557610) | Cod sursa (job #541310) | Cod sursa (job #3277877)
#include <fstream>
using namespace std;
ifstream cin("plantatie.in");
ofstream cout("plantatie.out");
const int NMAX = 502;
int a[NMAX][NMAX];
int max(int a, int b)
{
return a > b ? a : b;
}
int max(int a, int b, int c, int d)
{
return max(max(a, b), max(c, d));
}
struct SparseTable
{
int n;
int rmq[20][NMAX][NMAX];
SparseTable(int n) : n(n)
{
int logN = 31 - __builtin_clz(n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
rmq[0][i][j] = a[i][j];
for (int k = 1; k <= logN; k++)
for (int i = 1; i + (1 << k) - 1 <= n; i++)
for (int j = 1; j + (1 << k) - 1 <= n; j++)
{
int len1 = i + (1 << (k - 1)), len2 = j + (1 << (k - 1));
rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][len1][j], rmq[k - 1][i][len2], rmq[k - 1][len1][len2]);
}
}
int query(int i, int j, int l)
{
int k = 31 - __builtin_clz(l);
int i1 = i + l - 1 - (1 << k) + 1, j1 = j + l - (1 << k);
return max(rmq[k][i][j], rmq[k][i1][j], rmq[k][i][j1], rmq[k][i1][j1]);
}
};
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
SparseTable rmq(n);
while (m--)
{
int i, j, l;
cin >> i >> j >> l;
cout << rmq.query(i, j, l) << '\n';
}
return 0;
}