Cod sursa(job #2787950)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 24 octombrie 2021 14:18:13
Problema Plantatie Scor 10
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 <= LOG; 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;
}