Pagini recente » Istoria paginii runda/test_78 | Cod sursa (job #1024843) | Cod sursa (job #998946) | Cod sursa (job #584579) | Cod sursa (job #2754887)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
#define NMAX 501
int rmq[11][NMAX][NMAX], logg2[NMAX], N, M;
int maxx(int a, int b, int c, int d) //calculeaza maxx ul dintre cele 4 numere
{
a = max(a, b);
c = max(c, d);
return max(a, c);
}
void logaritm() //aceasta functie calculeaza logaritmii in baza 2
{
for (int i = 2; i <= N; ++i)
logg2[i] = logg2[i / 2] + 1;
}
//formam matricea pentru laturile puteri ale lui 2.
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] = maxx(rmq[k - 1][i][j], //nord vest
rmq[k - 1][i + (1 << (k - 1))][j], //sud
rmq[k - 1][i][j + (1 << (k - 1))], //est
rmq[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]); // sud est pe diagonala
}
void query(int a, int b, int k) {
int len = logg2[k];
fout << maxx(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);
}
}