Cod sursa(job #26122)

Utilizator StTwisterKerekes Felix StTwister Data 5 martie 2007 11:12:31
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <stdio.h>

#define NMAX 501
#define log2NMAX 10
#define MMAX 75.000

int N,M;
int A[NMAX][NMAX][log2NMAX];

inline int max(int a, int b)
{
    return a < b ? b : a;
}

int main()
{
    freopen("plantatie.in", "r", stdin);
    freopen("plantatie.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (int i = 1; i<=N; ++i)
    {
        for (int j = 1; j<=N; ++j)
        {
            scanf("%d", &A[i][j][0]);
        }
    }


    // preprocesare in O(N^2*logN)
    for (int k = 1, p = 2; p<=N; ++k, p*=2)
    {
        for (int i1 = 1; i1<=N-p+1; ++i1)
        {
            for (int j1 = 1; j1<=N-p+1; ++j1)
            {
                int i2 = i1 + p/2;
                int j2 = j1 + p/2;
                A[i1][j1][k] = max(max(A[i1][j1][k-1], A[i2][j1][k-1]), max(A[i1][j2][k-1], A[i2][j2][k-1]));
            }
        }
    }

    // interogare in O(M) * O(1)
    for (int tz = 0; tz<M; ++tz)
    {
        int i1,j1,L;
        scanf("%d %d %d", &i1, &j1, &L);
        int k,p;
        for (k=0, p=1; p<=L; ++k, p*=2);
        --k;
        p/=2;
        int i2 = i1+L-p;
        int j2 = j1+L-p;
        int r = max(max(A[i1][j1][k], A[i1][j2][k]), max(A[i2][j1][k], A[i2][j2][k]));
        printf("%d\n", r);
    }

}