Cod sursa(job #1566507)

Utilizator robx12lnLinca Robert robx12ln Data 12 ianuarie 2016 10:46:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<fstream>
using namespace std;
ifstream fin("plantatie.in");
ofstream fout("plantatie.out");
int n,m,D[10][505][505],x1,y1,P[505],x2,y2,z,k;
int main(){
    fin >> n >> m;
    for( int i = 1; i <= n; i++ ){
        for( int j = 1 ;j <= n; j++ ){
            fin >> D[0][i][j];
        }
    }
    for( int k = 1; (1<<k) <= n; k++ ){
        for( int i = 1; i <= n; i++ ){
            for( int j = 1; j <= n; j++ ){
                D[k][i][j] = D[k-1][i][j];
                if( i + (1<<(k-1)) <= n ){
                    D[k][i][j] =max( D[k][i][j], D[k-1][i + (1<<(k-1))][j] );
                }
                if( j + (1<<(k-1)) <= n ){
                    D[k][i][j] =max( D[k][i][j], D[k-1][i][j + (1<<(k-1))] );
                }
                if( i + (1<<(k-1)) <= n && j + (1<<(k-1)) <= n ){
                    D[k][i][j] =max( D[k][i][j], D[k-1][i + (1<<(k-1))][j + (1<<(k-1))] );
                }
            }
        }
    }
    for( int i = 2; i <= n; i++ ){
        P[i] = P[i/2] + 1;
    }
    for( ; m != 0; m-- ){
        fin >> x1 >> y1 >> z;
        x2 = x1 + z - 1;
        y2 = y1 + z - 1;
        k = P[z];
        fout << max( D[k][x1][y1],max( D[k][x2 - (1<<k) + 1][y1],max( D[k][x1][y2 - (1<<k) + 1], D[k][x2 - (1<<k) + 1][y2 - (1<<k) + 1] ) ) ) << "\n";
    }
    return 0;
}