Cod sursa(job #3134054)

Utilizator vatau.lorenaVatau Lorena vatau.lorena Data 28 mai 2023 00:48:00
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <fstream>
using namespace std;

const char iname[] = "plantatie.in";
const char oname[] = "plantatie.out";

#define MAX_N  505

#define MAX_LG 10

int A[MAX_N][MAX_N][MAX_LG];

int N, M;

int main(void)
{
	ifstream fin(iname);
	ofstream fout(oname);

	fin >> N >> M;

	for (int i = 1; i <= N; ++i)
	{
		for (int j = 1; j <= N; ++j)
		{
			fin >> A[i][j][0];
		}
	}

	// Pre-compute values using a different method
	for (int k = 1; k <= MAX_LG; ++k)
	{
		for (int i = 1; i <= N; ++i)
		{
			for (int j = 1; j <= N; ++j)
			{
				int add = 1 << (k - 1);
				if ((i + add > N) || (j + add > N))
					continue;

				int ret = 0;
				for (int x = i; x <= i + add; ++x)
				{
					for (int y = j; y <= j + add; ++y)
					{
						ret = max(ret, A[x][y][k - 1]);
					}
				}
				A[i][j][k] = ret;
			}
		}
	}

	int P[MAX_N] = {0};
	for (int i = 0; (1 << i) <= N; ++i)
		P[1 << i] = i;
	for (int i = 3; i <= N; ++i)
	{
		if (P[i] == 0)
			P[i] = P[i - 1];
	}

	for (int m = 0; m < M; ++m)
	{
		int i, j, k;
		fin >> i >> j >> k;

		int r = P[k];
		int ret = 0;
		for (int x = i; x <= i + k - (1 << r); ++x)
		{
			for (int y = j; y <= j + k - (1 << r); ++y)
			{
				ret = max(ret, A[x][y][r]);
			}
		}
		fout << ret << "\n";
	}

	fin.close();
	fout.close();

	return 0;
}