Cod sursa(job #2973732)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 1 februarie 2023 19:16:34
Problema Plantatie Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 502;
int pow2[30], lg2[NMAX], dp[NMAX][NMAX][30], m[NMAX][NMAX];
int solve( int l, int c, int k ){
    int ind = k - pow2[lg2[k]];
    k = lg2[k];
    return max({ dp[l + ind][c][k], dp[l][c + ind][k], dp[l][c][k], dp[l + ind][c + ind][k] });
}
int main()
{
    ifstream in("plantatie.in");
    ofstream out("plantatie.out");
    int n, q, a, b, k;
    in >> n >> q;
    for( int l = 1 ; l <= n ; l++ )
        for( int c = 1 ; c <= n ; c++ )
            in >> m[l][c];
    for( int i = 2 ; i <= n ; i++ )
		lg2[i] = lg2[i / 2] + 1;
    pow2[0] = 1;
    for( int i = 1; i < 30 ; i++ )
        pow2[i] = pow2[i-1] * 2;
    for( int l = 1 ; l <= n ; l++ )
        for( int c = 1 ; c <= n ; c++ )
            dp[l][c][0] = m[l][c];
    for( int k = 1 ; (1 << k) <= n; k++ )
		for( int l = 1; l + (1 << k) - 1 <= n; l++)
            for( int c = 1 ; c + ( 1 << k ) - 1 <= n ; c++ )
                dp[l][c][k] = max({ dp[l][c][k-1], dp[l + ( 1 << (k-1) )][c][k-1], dp[l][c + (1 << (k-1) )][k-1], dp[l + (1 << (k-1) )][c + (1 << (k-1))][k-1] });
    while(q--){
        in >> a >> b >> k;
        out << solve(a, b, k ) << endl;
    }
    return 0;
}