Cod sursa(job #3164542)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 3 noiembrie 2023 16:08:34
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("plantatie.in");
ofstream out("plantatie.out");
const int NMAX = 502;
int pow2[12], lg2[NMAX], dp[NMAX][NMAX][30], m[NMAX][NMAX];
static inline 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()
{
    ios_base::sync_with_stdio(false);
    in.tie(nullptr), out.tie(nullptr);

    int n, q, a, b, k, ll, cc;
    in >> n >> q;
    for( int l = 1 ; l <= n ; l++ )
        for( int c = 1 ; c <= n ; c++ ){
            in >> m[l][c];
            dp[l][c][0] = m[l][c];
        }
    for( int i = 2 ; i <= n ; i++ )
		lg2[i] = lg2[i / 2] + 1;
    pow2[0] = 1;
    for( int i = 1; i < 12 ; i++ )
        pow2[i] = pow2[i-1] * 2;
    for( int lg = 1 ; lg <= lg2[n] ; lg++ )
		for( int l = 1; ( ll = l + pow2[lg - 1]) <= n; l++)
            for( int c = 1 ; ( cc = c + pow2[lg - 1]) <= n ; c++ )
                dp[l][c][lg] = max({ dp[l][c][lg - 1], dp[ll][c][lg - 1], dp[l][cc][lg - 1], dp[ll][cc][lg - 1] });
    while(q--){
        in >> a >> b >> k;
        out << solve(a, b, k) << "\n";
    }
    return 0;
}