Pagini recente » Cod sursa (job #2069406) | Cod sursa (job #2753078) | Cod sursa (job #2455979) | Cod sursa (job #868648) | Cod sursa (job #2754425)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n, q;
// log2 500 = 8.9
int rmq[503][503][10];
void citire()
{
int i, j;
fin >> n >> q;
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
fin >> rmq[i][j][0]; // pun maximele din patratele de lg 1 direct
}
void matrice()
{
/// rmq[i][j][k] = elementul maxim din patratul
/// care incepe in (i, j) si are latura 2^k
int i, j, k, lungime;
for(k = 1; (1 << k) <= n; k++) // iau pe rand puterile lui 2
for(i = 1; i <= n - (1 << k) + 1; i++) // iau pe rand coltul din stanga sus (i, j)
for(j = 1; j <= n - (1 << k) + 1; j++)
{
lungime = 1 << (k - 1);
rmq[i][j][k] = max( rmq[i][j][k - 1], max(
rmq[i + lungime][j][k - 1], max(
rmq[i][j + lungime][k - 1],
rmq[i + lungime][j + lungime][k - 1] )));
}
}
int logaritm2(int x)
{
int i;
for(i = 0; 1 << i <= x; i++) ;
return (i - 1);
}
void rezolvare()
{
int i, j, k, sol, lglat, putere2;
for(;q--;)
{
fin >> i >> j >> k;
// lglat = log din lungimea laturii
// putere2 = cea mai mica putere a lui doi <= k
lglat = logaritm2(k);
putere2 = 1 << lglat;
sol = max( rmq[i][j][lglat], max(
rmq[i + k - putere2][j][lglat], max(
rmq[i][j + k - putere2][lglat],
rmq[i + k - putere2][j + k - putere2][lglat]
)));
fout << sol << "\n";
}
}
int main()
{
citire();
matrice();
rezolvare();
fin.close();
fout.close();
return 0;
}