Pagini recente » Cod sursa (job #2188944) | Cod sursa (job #2763487) | Cod sursa (job #2762214) | Cod sursa (job #1953949) | Cod sursa (job #2903047)
#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";
}
}