Pagini recente » Cod sursa (job #1167760) | Cod sursa (job #3339776) | Cod sursa (job #3159280) | Cod sursa (job #292536) | Cod sursa (job #3356588)
#include <fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
const int NMAX = 505;
int n,m;
int A[NMAX][NMAX];
int log2[NMAX];
int pow2[18];
int rmq[18][NMAX][NMAX];
void read()
{
fin >> n >> m;
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
fin >> A[i][j];
}
}
}
void buildPow2()
{
pow2[0] = 1;
for(int i = 1; i < 18; ++i){
pow2[i] = pow2[i - 1] * 2;
}
}
void buildLogs()
{
log2[1] = 0;
for(int i = 2; i < NMAX; ++i){
log2[i] = log2[i / 2] + 1;
}
}
void buildRMQ()
{
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
rmq[0][i][j] = A[i][j];
}
}
for(int k = 1; k < 18; ++k){
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
if(i < n - pow2[k - 1] && j < n - pow2[k - 1]){
rmq[k][i][j] = max(max(rmq[k - 1][i][j], rmq[k - 1][i + pow2[k - 1]][j]), max(rmq[k - 1][i][j + pow2[k - 1]], rmq[k - 1][i + pow2[k - 1]][j + pow2[k - 1]]));
}
else if(i < n - pow2[k - 1]){
rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][i + pow2[k - 1]][j]);
}
else if(j < n - pow2[k - 1]){
rmq[k][i][j] = max(rmq[k - 1][i][j], rmq[k - 1][i][j + pow2[k - 1]]);
}
else{
rmq[k][i][j] = rmq[k - 1][i][j];
}
}
}
}
}
void precalculate()
{
buildPow2();
buildLogs();
buildRMQ();
}
void solve()
{
for(int i = 0; i < m; ++i){
int x1,y1,l;
fin >> x1 >> y1 >> l;
--x1;
--y1;
int x2 = x1 + l - 1;
int y2 = y1 + l - 1;
int k = log2[l];
fout << max(max(rmq[k][x1][y1], rmq[k][x2 - pow2[k] + 1][y1]), max(rmq[k][x1][y2 - pow2[k] + 1], rmq[k][x2 - pow2[k] + 1][y2 - pow2[k] + 1])) << '\n';
}
}
int main()
{
read();
precalculate();
solve();
return 0;
}