Cod sursa(job #133494)

Utilizator DastasIonescu Vlad Dastas Data 8 februarie 2008 19:26:09
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <algorithm>

const int maxn = 501;
const int maxm = 75001;

FILE *in = fopen("plantatie.in","r"), *out = fopen("plantatie.out","w");

int n, m;
int b[maxn][maxn][10];

void read()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 1; i <= n; ++i )
        for ( int j = 1; j <= n; ++j )
            fscanf(in, "%d", &b[i][j][0]);
}

int h[4];
int max(int x, int y, int p, int q)
{
    h[0] = x, h[1] = y, h[2] = p, h[3] = q;

    int ret = h[0];
    for ( int i = 1; i < 4; ++i )
        if ( h[i] > ret )
            ret = h[i];

    return ret;
}

void prec()
{
    for ( int k = 1; 1 << k <= n; ++k)
        for ( int i = 1; i <= n; ++i )
            for ( int j = 1; j <= n; ++j )
            {
                int p = 1 << (k - 1);
                if ( i + p <= n && j + p <= n )
                    b[i][j][k] = max(b[i][j][k-1], b[i][j+p][k-1], b[i+p][j][k-1], b[i+p][j+p][k-1]);
            }
}

int main()
{
    read();
    prec();

    int x, y, z;

    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d %d", &x, &y, &z);

        int p = 0;
        while ( 1 << p <= z )
            ++p;
        --p;

        int pp = 1 << p;

        fprintf(out, "%d\n", max(b[x][y][p], b[x][y+z-pp][p], b[x+z-pp][y][p], b[x+z-pp][y+z-pp][p]));
    }


	return 0;
}