Cod sursa(job #2847368)

Utilizator NeganAlex Mihalcea Negan Data 10 februarie 2022 18:46:32
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("plantatie.in");
ofstream fout("plantatie.out");

int n, m;
int a[505][505];
int dp[505][505][11];
int p[505];
void Citire()
{
    int i, j;
    fin >> n >> m;
    for(i = 1;i <= n;i++)
        for(j = 1;j <= n;j++)
            fin >> a[i][j];
}

void RMQ2D()
{
    int i, j, k;
    p[1] = 0;
    for(i = 2;i <= n;i++)
        p[i] = p[i / 2] + 1;
    int N = p[n];
    for(i = 1;i <= n;i++)
        for(j = 1;j <= n;j++)
            dp[i][j][0] = a[i][j];
    for(k = 1;k <= N;k++)
    {
        int pmax = n - (1 << (k - 1));
        for(i = 1;i <= pmax;i++)
            for(j = 1;j <= pmax;j++)
                dp[i][j][k] = max(dp[i][j + (1 << k - 1)][k - 1],
                                  max(dp[i + (1 << k - 1)][j][k - 1],
                                      max(dp[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1], dp[i][j][k - 1])));
    }
}

int Solve(int i, int j, int k)
{
    int pau = p[k];
    int sol;
    int pozi = i + k - (1 << pau);
    int pozj = j + k - (1 << pau);
    sol = max(dp[i][j][pau], dp[pozi][j][pau]);
    sol = max(sol, dp[pozi][pozj][pau]);
    sol = max(sol, dp[i][pozj][pau]);
    return sol;
}
void Queries()
{
    int i, x, y, k;
    for(i = 1;i <= m;i++)
    {
        fin >> x >> y >> k;
        fout << Solve(x, y, k) << "\n";
    }
}
int main()
{
    Citire();
    RMQ2D();
    Queries();
    return 0;
}