Pagini recente » Cod sursa (job #2881404) | Cod sursa (job #1833630) | Cod sursa (job #1896795) | Cod sursa (job #1831432) | Cod sursa (job #3307080)
#include <bits/stdc++.h>
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int n, m, dp[15][505][505], x, y, k;
int pwr (int x) {
int p = 1;
while ((1<<p) <= x)
++p;
return p-1;
}
int main()
{
f >> n >> m;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
f >> dp[0][i][j];
for (int p=1; (1<<p)<=n; ++p)
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j){
dp[p][i][j] = dp[p-1][i][j];
int aux = (1<<(p-1));
if (i + aux <= n && j + aux <= n) {
dp[p][i][j] = max (dp[p][i][j], dp[p-1][i+aux][j]);
dp[p][i][j] = max (dp[p][i][j], dp[p-1][i][j+aux]);
dp[p][i][j] = max (dp[p][i][j], dp[p-1][i+aux][j+aux]);
}
else {
if (i + aux <= n)
dp[p][i][j] = max (dp[p][i][j], dp[p-1][i+aux][j]);
if (j + aux <= n)
dp[p][i][j] = max (dp[p][i][j], dp[p-1][i][j+aux]);
}
}
for (int i=1; i<=m; ++i) {
f >> x >> y >> k;
int p = pwr (k);
int ans = max (dp[p][x][y], dp[p][x+k-(1<<p)][y]);
ans = max (ans, dp[p][x][y+k-(1<<p)]);
ans = max (ans, dp[p][x+k-(1<<p)][y+k-(1<<p)]);
g << ans << '\n';
}
return 0;
}