Cod sursa(job #2593006)

Utilizator georgecristian2002Raducanu George-Cristian georgecristian2002 Data 2 aprilie 2020 18:12:38
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

const int N = 501;
const int M = 9;

int n, m, x, y, k;
int lg[N], rmq[M][N][N];
inline int maxi(int a, int b)
{
    if(a>b)
        return a;
    else
        return b;
}

int main() {
	fin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			fin >> rmq[0][i][j];

	lg[1] = 0;
	for (int i = 2; i <= n; i++)
		lg[i] = 1 + lg[i / 2];

	for (int i = 1; (1<<i) <=n; i++) {
		int l = (1 << (i - 1));
		for (int j = (1 < i); j <= n; j++) {
			for (int k = (1 << i); k <= n; k++) {
				rmq[i][j][k] = maxi(maxi(rmq[i - 1][j][k], rmq[i - 1][j][k - l]), maxi(rmq[i - 1][j -l][k], rmq[i - 1][j - l][k - l]));
			}
		}
	}

	for (int i = 1; i <= m; i++) {
		fin >> x >> y >> k;
		x += k - 1;
		y += k - 1;
		int l = lg[k];
		fout << maxi(maxi(rmq[l][x][y], rmq[l][x][y - k + (1 << l)]), maxi(rmq[l][x - k + (1 << l)][y], rmq[l][x - k + (1 << l)][y - k + (1 << l)])) << '\n';
	}
	fin.close();
	fout.close();
	return 0;
}