Pagini recente » Cod sursa (job #2165721) | Diferente pentru implica-te/arhiva-educationala intre reviziile 124 si 123 | Cod sursa (job #3124172) | Cod sursa (job #1128013) | Cod sursa (job #1772243)
#include <iostream>
#include <cstdio>
#define MAXN 512
#define MAXLOG 10
using namespace std;
int n, m;
int a[MAXN][MAXN];
int rmq[MAXN][MAXN][MAXLOG], log[MAXN];
void read()
{
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
}
int maxim(int e, int f, int g, int h)
{
return max(max(e, f), max(g, h));
}
void prepare()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
rmq[i][j][0] = a[i][j];
log[1] = 0;
for (int i = 2; i <= n; i++)
if (i >= (1<<(log[i-1]+1)))
log[i] = log[i-1]+1;
else
log[i] = log[i-1];
for (int k = 1, crt = 1; k < MAXLOG; k++, crt <<= 1)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
rmq[i][j][k] = rmq[i][j][k-1];
if (i+crt <= n)
rmq[i][j][k] = max(rmq[i][j][k], rmq[i+crt][j][k-1]);
if (j+crt <= n)
rmq[i][j][k] = max(rmq[i][j][k], rmq[i][j+crt][k-1]);
if (i + crt <= n && j + crt <= n)
rmq[i][j][k] = max(rmq[i][j][k], rmq[i+crt][j+crt][k-1]);
}
}
int query(int x, int y, int k)
{
int crt = log[k];
return maxim(rmq[x][y][crt], rmq[x+k-(1<<crt)][y][crt], rmq[x][y+k-(1<<crt)][crt], rmq[x+k-(1<<crt)][y+k-(1<<crt)][crt]);
}
void solve()
{
for (int i = 1; i <= m; i++) {
int x, y, k;
scanf("%d %d %d", &x, &y, &k);
printf("%d\n", query(x, y, k));
}
}
int main()
{
freopen("plantatie.in", "r", stdin);
freopen("plantatie.out", "w", stdout);
read();
prepare();
solve();
return 0;
}