Cod sursa(job #2397532)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 4 aprilie 2019 15:36:05
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 505;

int dp[MAXN][MAXN][20];
int mat[MAXN][MAXN];

int main()
{
    ifstream fin("plantatie.in");
    ofstream fout("plantatie.out");
    int n, m;
    fin >> n >> m;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            fin >> mat[i][j];
    for(int i = 1; i <= n; ++i){
        for(int j = 1; j <= n; ++j)
            dp[i][j][0] = mat[i][j];
    }
    for(int k = 1; k <= log2(n) + 1; ++k){
        for(int i = 1; i <= n && i + (1 << k) <= n + 1; ++i){
            for(int j = 1; j <= n && j + (1 << k) <= n + 1; ++j){
                dp[i][j][k] = dp[i][j][k - 1];
                dp[i][j][k] = max(dp[i][j][k], dp[i + (1 << (k - 1))][j + (1 << (k  - 1))][k - 1]);
                dp[i][j][k] = max(dp[i][j][k], dp[i + (1 << (k - 1))][j][k - 1]);
                dp[i][j][k] = max(dp[i][j][k], dp[i][j + (1 << (k - 1))][k - 1]);
            }
        }
    }
    while(m){
        int x, y, dist;
        fin >> x >> y >> dist;
        int put = log2(dist);
        int ans = max(dp[x][y][put], dp[x + dist - (1 << put)][y][put]);
        ans = max(ans, dp[x][y + dist - (1 << put)][put]);
        ans = max(ans, dp[x + dist - (1 << put)][y + dist - (1 << put)][put]);
        fout << ans << "\n";
        m--;
    }
    return 0;
}