Pagini recente » Cod sursa (job #2640764) | Cod sursa (job #1042078) | Cod sursa (job #2580003) | Cod sursa (job #2102564) | Cod sursa (job #2222866)
#include <fstream>
using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
const int MAXN = 501;
const int MAXLOG = 9;
int N, M;
int p[MAXN][MAXN];
int RMQ[MAXN][MAXN][MAXLOG]; //RMQ[l][c][k] reprezinta maximul din patratul cu coltul stanga-sus (l, c) si latura 2 ^ k
int lg[MAXN];
void logaritmi()
{
lg[0] = lg[1] = 0;
for(int i = 2; i <= N; i++)
lg[i] = lg[i >> 1] + 1;
}
void compute_rmq()
{
for(int l = 1; l <= N; l++)
for(int c = 1; c <= N; c++)
RMQ[l][c][0] = p[l][c];
for(int k = 1; (1 << k) <= N; k++)
for(int l = 0; l + (1 << k) - 1 <= N; l++)
for(int c = 0; c + (1 << k) - 1 <= N; c++)
{
int pwr = 1 << (k - 1);
RMQ[l][c][k] = max(RMQ[l][c][k - 1], max(RMQ[l][c + pwr][k - 1], max(RMQ[l + pwr][c][k - 1], RMQ[l + pwr][c + pwr][k - 1])));
}
}
int range_maximum_query(int l, int c, int k)
{
int log = lg[k], pwr = 1 << log;
return max(RMQ[l][c][log], max(RMQ[l][c + k - pwr][log], max(RMQ[l + k - pwr][c][log], RMQ[l + k - pwr][c + k - pwr][log])));
}
int main()
{
in >> N >> M;
logaritmi();
for(int l = 1; l <= N; l++)
for(int c = 1; c <= N; c++)
in >> p[l][c];
compute_rmq();
int l, c, k;
for(int i = 1; i <= M; i++)
{
in >> l >> c >> k;
out << range_maximum_query(l, c, k) << '\n';
}
return 0;
}