Cod sursa(job #836716)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 16 decembrie 2012 16:49:18
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <iostream>
#include <cstdlib>
#define MAX_SIZE 501
using namespace std;

int matr[10][MAX_SIZE][MAX_SIZE];
int N , M;
int log[MAX_SIZE];


int query( int x , int y , int edge)
{
    int lg = log[edge];
    int maxim = -1;
    int dif = edge - (1 << lg);
    if (maxim < matr[lg][x][y])
    {
        maxim = matr[lg][x][y];
    }
    if (maxim < matr[lg][x][y+dif])
    {
        maxim = matr[lg][x][y+dif];
    }
    if (maxim < matr[lg][x+dif][y])
    {
        maxim = matr[lg][x+dif][y];
    }
    if (maxim < matr[lg][x+dif][y+dif])
    {
        maxim = matr[lg][x+dif][y+dif];
    }
    return maxim;
}


void pre()
{
    log[1] = 0;
    for (int i = 2 ;i <= N;i++)
    {
        log[i] = log[ i >> 1] + 1;
    }

    for (int k = 1;k <= log[N];k++)
    for (int i = 1;i<= N - (1 << k) +1;i++)
    for (int j = 1;j<= N - (1 << k) +1;j++)
    {
        int maxim = -1;
        int l = ( 1 << (k-1));
        if (maxim < matr[k-1][i][j])
        {
            maxim = matr[k-1][i][j];
        }
        if (maxim < matr[k-1][i][j+l])
        {
            maxim = matr[k-1][i][j+l];
        }
        if (maxim < matr[k-1][i+l][j])
        {
            maxim = matr[k-1][i+l][j];
        }
        if (maxim < matr[k-1][i+l][j+l])
        {
            maxim = matr[k-1][i+l][j+l];
        }
        matr[k][i][j] = maxim;
    }
}


int main()
{
    ifstream input("plantatie.in");
    ofstream output("plantatie.out");
    input >> N >> M;
    for (int i = 1 ;i <= N;i++)
    for (int j = 1; j <= N;j++)
    {
        input >> matr[0][i][j];
    }
    pre();

    for (int i =0;i<M;i++)
    {
        int x , y , h;
        input >> x >> y >> h;
        output << query(x,y,h) << "\n";
    }
    input.close();
    output.close();
    return 0;
}