Cod sursa(job #2398788)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 6 aprilie 2019 09:51:16
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <cmath>

const int MAXN = 500 + 5;

using namespace std;

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

int n,query,dp[MAXN][MAXN][MAXN],v[MAXN][MAXN];

int main()
{
    in>>n>>query;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            in>>v[i][j];
            dp[0][i][j] = v[i][j];
        }
    }
    for(int k = 1; (1<<k) <= n; k++){
        for(int i = 1; i + (1<<k) - 1 <= n; i++){
            for(int j = 1; j + (1<<k) - 1 <= n; j++){
                int put = (1<<(k - 1));
                dp[k][i][j] = max(dp[k - 1][i][j],dp[k - 1][i + put][j + put]);;
                dp[k][i][j] = max(dp[k][i][j],dp[k - 1][i][j + put]);
                dp[k][i][j] = max(dp[k][i][j],dp[k - 1][i + put][j]);
            }
        }
    }
    for(int test = 1; test <= query; test++){
        int i,j,k,log,put;
        in>>i>>j>>k;
        log = log2(k);
        put = (1<<log);
        int ans = max(dp[log][i][j],dp[log][i + k - put][j]);
        ans = max(ans,max(dp[log][i][j + k - put],dp[log][i + k - put][j + k - put]));
        out<<ans<<'\n';

    }
    return 0;
}