Cod sursa(job #3307080)

Utilizator petric_mariaPetric Maria petric_maria Data 16 august 2025 23:33:18
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#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;
}