Cod sursa(job #1514668)

Utilizator cristina_borzaCristina Borza cristina_borza Data 31 octombrie 2015 13:44:10
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>

using namespace std;

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

int n , m , x1 , y1 , x2 , y2 , d , t1, t2;
int mat[505][505] , r[505][505][25] , lg[505];

int main() {
    f >> n >> m;

    for(int i = 1 ; i <= n; ++i) {
        for(int j = 1 ; j <= n ; ++j) {
            f >> mat[i][j];
        }
    }

    for(int i = 1 ; i <= n ; ++i) {
        for(int j = 1 ; j <= n ; ++j) {
            r[i][j][0] = mat[i][j];
            for(int k = 1 ; (1 << k) <= min(i , j) ; ++k) {
                t1 = max(r[i - (1 << (k - 1))][j - (1 << (k - 1))][k - 1] , r[i][j][k - 1]);
                t2 = max(r[i - (1 << (k - 1))][j][k - 1] , r[i][j - (1 << (k - 1))][k - 1]);
                r[i][j][k] = max(t1 , t2);
            }
        }
    }

    for(int i = 1 ; i <= n ; ++i) {
        int aux = 1;
        while((1 << aux) <= i) {
            ++aux;
        }

        lg[i] = aux - 1;
    }

    for(int i = 1 ; i <= m ; ++i) {
        f >> x1 >> y1 >> d;
        x2 = x1 + d - 1;
        y2 = y1 + d - 1;

        int aux = lg[d];

        t1 = max(r[x2][y2][aux] , r[x1 + (1 << aux) - 1][y1 + (1 << aux) - 1][aux]);
        t2 = max(r[x1 + (1 << aux) - 1][y2][aux] , r[x2][y1 + (1 << aux) - 1][aux]);

        g << max(t1 , t2) << '\n';
    }
    return 0;
}