Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2016153) | Monitorul de evaluare | Cod sursa (job #2754549)
#include <iostream>
#include <fstream>
using namespace std;
#define NMAX 501
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int rmq[11][NMAX][NMAX], Log2[NMAX], N, M;
int max(int a, int b, int c, int d) {
a = max(a, b);
c = max(c, d);
return max(a, c);
}
void logaritm() {
//calculez log2 din numerele de la 1 la n
for (int i = 2; i <= N; ++i)
Log2[i] = Log2[i / 2] + 1;
}
//vom calcula matricea A dar doar pentru laturi puteri ale lui 2.
// A[i][j][k] va fi elementul de valoare maxima dintr-un patrat cu coltul stanga-sus pe linia i si coloana j si latura 2ˆk
void proces() {
for (int k = 1; (1 << k) <= N; ++k)
for (int i = 1; i + (1 << k) - 1 <= N; ++i)
for (int j = 1; j + (1 << k) - 1 <= N; ++j)
rmq[k][i][j] = max(rmq[k - 1][i][j], //stanga sus
rmq[k - 1][i + (1 << (k - 1))][j], //jos
rmq[k - 1][i][j + (1 << (k - 1))], //dreapta
rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]); // dreapta jos pe diagonala
} //lng interv
//Pentru o raspunde la o intrebare i j k in O(1) vom determina cea mai mare
// putere p a lui 2 astfel incat 2ˆp ≤ k, si vom lua maximul din 4 patrate cu
// colturile in patratul din intrebare si latura 2ˆp.
void query(int a, int b, int k) {
int len = Log2[k];
fout << max(rmq[len][a][b],
rmq[len][a][b + k - (1 << len)],
rmq[len][a + k - (1 << len)][b],
rmq[len][a + k - (1 << len)][b + k - (1 << len)]) << '\n';
}
int main() {
fin >> N >> M;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
fin >> rmq[0][i][j];
logaritm();
proces();
int a, b, k;
for (int q = 1; q <= M; ++q) {
fin >> a >> b >> k;
query(a, b, k);
}
}