Mai intai trebuie sa te autentifici.
Cod sursa(job #2787978)
| Utilizator | Data | 24 octombrie 2021 15:19:35 | |
|---|---|---|---|
| Problema | Plantatie | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva de probleme | Marime | 1.15 kb |
#include <bits/stdc++.h>
#define DIM 505
#define LOG 10
using namespace std;
ifstream f("plantatie.in");
ofstream g("plantatie.out");
int n, m, dp[DIM][DIM][LOG];// dp[i][j][k] maximul din patratul cu coltul stanga sus in i, j de latura 2^k
int lg[DIM];
int main()
{
f >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
f >> dp[i][j][0];
for(int i = 2; i <= n; i++)
lg[i] = lg[i / 2] + 1;
for(int i = 1; i <= lg[n]; i++)
for(int j = 1; j + (1 << i) - 1 <= n; j++)
for(int k = 1; k + (1 << i) - 1 <= n; k++)
dp[j][k][i] = max(max(dp[j][k][i - 1], dp[j + (1 << i - 1)][k + (1 << i - 1)][i - 1]),
max(dp[j][k + (1 << i - 1)][i - 1], dp[j + (1 << i - 1)][k][i - 1]));
for(int i = 1; i <= m; i++)
{
int x, y, l;
f >> x >> y >> l;
int k = lg[l];
int sol = max(max(dp[x][y][k], dp[x][y + l - (1 << k)][k]),
max(dp[x + l - (1 << k)][y][k], dp[x + l - (1 << k)][y + l - (1 << k)][k]));
g << sol << "\n";
}
return 0;
}
