Pagini recente » Cod sursa (job #933352) | Cod sursa (job #697484) | Cod sursa (job #2593438) | Cod sursa (job #1886158) | Cod sursa (job #812154)
Cod sursa(job #812154)
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;
ifstream fi ("plantatie.in");
ofstream fo ("plantatie.out");
const int dim = 502;
int N, M, P[dim], B[dim][dim][9];
void prepr ()
{
int i, j, k, p, p1;
fi >> N >> M;
for (i = 1; i <= N; i++)
{
for (j = 1; j <= N; j++)
fi >> B[i][j][0];
if (i > 1)
P[i] = P[i>>1] + 1;
}
for (k = 1; 1<<k <= N; k++)
{
p = 1 << k-1;
p1 = (1<<k) - 1;
for (i = 1; i+p1 <= N; i++)
for (j = 1; j+p1 <= N; j++)
{
B[i][j][k] = max
(
max (B[i][j][k-1], B[i+p][j+p][k-1]),
max (B[i+p][j][k-1], B[i][j+p][k-1])
);
}
}
}
int query (int i, int j, int k)
{
//c = latura celui mai mare patrat de latime 2^ceva din interior
//r = restul pana la patratul de latime k
int c = 1 << P[k];
int r = k - c;
if (r == 0)
{
return B[i][j][P[k]];
}
int best = max (B[i][j][P[k]], query (i + c, j + c, r));
for (int poz = 0; poz + r <= k; poz += r)
{
best = max (best, max (query (i + poz, j + c, r), query (i + c, j + poz, r)));
}
return best;
}
int main ()
{
int i, j, k;
prepr ();
while (M--)
{
fi >> i >> j >> k;
fo << query (i, j, k) << '\n';
}
return 0;
}