Cod sursa(job #3134298)

Utilizator lucapetchiPetchi Andrei Luca lucapetchi Data 28 mai 2023 20:52:55
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
using namespace std;
string fisier = "plantatie";
ifstream in(fisier + ".in");
ofstream out(fisier + ".out");
const int N = 500;
int dp[9][N + 1][N + 1], np(0), p[9];
int main()
{
    int n, m, x, k, i, j, e, st;
    in >> n >> m;
    p[np++] = 1;
    for (i = 2; i <= n; i = i << 1)
    {
        p[np++] = i;
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
        {
            in >> dp[0][i][j];
        }
    }
    for (k = 1; k < np; k++)
    {
        for (i = p[k]; i <= n; i++)
        {
            for (j = p[k]; j <= n; j++)
            {
                dp[k][i][j] = max(max(dp[k - 1][i][j], dp[k - 1][i - p[k - 1]][j]), max(dp[k - 1][i][j - p[k - 1]], dp[k - 1][i - p[k - 1]][j - p[k - 1]]));
            }
        }
    }
    while (m--)
    {
        in >> i >> j >> k;

        st = 1, e = np - 1;
        while (st <= e)
        {
            int mid = (st + e) / 2;
            if (p[mid] <= k)
            {
                st = mid + 1;
            }
            else
            {
                e = mid - 1;
            }
        }
        x = p[e];
        out << max(max(dp[e][i + x - 1][j + x - 1], dp[e][i + k - 1][j + x - 1]), max(dp[e][i + x - 1][j + k - 1], dp[e][i + k - 1][j + k - 1])) << '\n';
    }
}