Cod sursa(job #2278333)

Utilizator DordeDorde Matei Dorde Data 7 noiembrie 2018 17:44:46
Problema Plantatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>

using namespace std;
int const NM = 500;
int log [1 + NM] , r [10][1 + NM][1 + NM] , n , m;
ifstream f ("plantatie.in");
ofstream g ("plantatie.out");
int main()
{
    f >> n >> m;
    for(int i = 1 ; i <= n ; ++ i)
        for(int j = 1 ; j <= n ; ++ j)
            f >> r [0][i][j];
    for(int i = 2 ; i <= n ; ++ i)
        log [i] = 1 + log [i / 2];
    for(int i = 1 ; i <= 1 + log [n] ; ++ i)
        for(int j = 1 << i ; j <= n ; ++ j)
            for(int k = 1 << i ; k <= n ; ++ k){
                    r [i][j][k] = max (r [i - 1][j - (1 << (i - 1))][k - (1 << (i - 1))] , r [i - 1][j][k]);
                    r [i][j][k] = max (r [i][j][k] , r [i - 1][j - (1 << (i - 1))][k]);
                    r [i][j][k] = max (r [i][j][k] , r [i - 1][j][k - (1 << (i - 1))]);
            }
    for(int i = 1 ; i <= m ; ++ i){
        int a , b , c;
        f >> a >> b >> c;
        int l = (1 << log [c]) , ans , lg = log [c];
        if (l == c)
            ans = r [lg][a + c - 1][b + c - 1];
        else
            ans = max (r [lg][a + c - 1][b + c - 1] , max (r [lg][a + c - 1][b + l - 1] , max (r [lg][a + l - 1][b + c - 1] , r [lg][a + l - 1][b + l - 1])));
        g << ans << '\n';
    }
    return 0;
}