Cod sursa(job #2903047)

Utilizator Bogdan197Putineanu Bogdan Bogdan197 Data 17 mai 2022 01:36:08
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;

int plantatie_rmq[510][510][25];
int nr_linii, nr_operatii;

int query(int line, int column, int square_size)
{
	int log = log2(square_size);
	if (log == log2(square_size))
	{
		if(nr_linii != square_size)		
			return plantatie_rmq[line][column][log];
		log--;	// caz particular, se cere toata zona dar nu e calculata
	}

	int val1 = max(plantatie_rmq[line][column][log], plantatie_rmq[line][column + square_size - (1 << log)][log]);				// construim patratul curent din 4 subpatrate
	int val2 = max(plantatie_rmq[line + square_size - (1 << log)][column][log], plantatie_rmq[line + square_size - (1 << log)][column + square_size - (1 << log)][log]);
	return max(val1, val2);

}

int main()
{
	ifstream f("plantatie.in");
	ofstream g("plantatie.out");

	f >> nr_linii >> nr_operatii;

	for (int i = 1; i <= nr_linii; i++)
		for (int j = 1; j <= nr_linii; j++)
			f >> plantatie_rmq[i][j][0];


	for (int log = 1; 1 << log < nr_linii; log++)	// vom memora minimul patratelor de 2x2, 4x4, 8x8 etc. pt fiecare element
	{
		for (int linie = 1; linie + (1 << log) - 1 <= nr_linii; linie++)			//
			for (int coloana = 1; coloana + (1 << log) - 1 <= nr_linii; coloana++)
			{
				int val1 = max(plantatie_rmq[linie][coloana][log - 1], plantatie_rmq[linie][coloana + (1 << (log-1))][log - 1]);				// construim patratul curent din 4 subpatrate
				int val2 = max(plantatie_rmq[linie + (1 << (log - 1))][coloana][log - 1], plantatie_rmq[linie + (1 << (log - 1))][coloana + (1 << (log - 1))][log - 1]);
				plantatie_rmq[linie][coloana][log] = max(val1, val2);
			}
	}
	int i, j, size;
	for (int k = 0; k < nr_operatii; k++)
	{
		f >> i >> j >> size;
		g << query(i, j, size) << "\n";
	}
			


}