Cod sursa(job #1199958)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 21 iunie 2014 12:44:37
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>

using namespace std;

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

const int nmax = 501 , lognmax = 9;

int n , m , r[lognmax][nmax][nmax] , lg[nmax];

inline int max(int x, int y)
{
    return x > y ? x : y;
}

int main()
{
    int i , j , k , j1 , k1 , a , b , a1 , b1 , a2 , b2 , l , L;

    in >> n >> m;

    for(i = 1 ; i <= n ; i++)
        for(j = 1 ; j <= n ; j++)
            in >> r[0][i][j];

    for(i = 1 ; i < lognmax ; i++)
        for(j = 1 ; j <= n ; j++)
            for(k = 1 ; k <= n ; k++)
            {
                if((1 << i) > j || (1 << i) > k)
                    continue;

                j1 = j - (1 << (i - 1));
                k1 = k - (1 << (i - 1));
                r[i][j][k] = max(max(r[i - 1][j1][k1] , r[i - 1][j1][k]) , max(r[i - 1][j][k1] , r[i-1][j][k]));
            }

    for(i = 2 ; i <= n ; i++)
        lg[i] = 1 + lg[i / 2];

    for(i = 1 ; i <= m ; i++)
    {
        in >> a >> b >> l;

        L = lg[l];

        a1 = a + (1 << L) - 1;
        b1 = b + (1 << L) - 1;
        a2 = a + l - 1;
        b2 = b + l - 1;

        out << max(max(r[L][a1][b1] , r[L][a1][b2]) , max(r[L][a2][b1] , r[L][a2][b2])) << '\n';
    }
    return 0;
}