Cod sursa(job #87165)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 26 septembrie 2007 19:29:26
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <stdio.h>

#define NMAX (1<<9)
#define MAX(a,b) (((a)>(b))?(a):(b))

int A[NMAX][NMAX], Q[NMAX][NMAX][12], N, M;

void read()
{
        int i, j;

        freopen("plantatie.in", "r", stdin);
        scanf("%d%d", &N, &M);
        for (i = 1; i <= N; i++)
            for (j = 1; j <= N; j++)
            {
                scanf("%d", &A[i][j]);
                Q[i][j][0] = A[i][j];
            }
}

void solve()
{
        int i, j, k, p, e;

        for (i = N; i >= 1; i--)
            for (j = N; j >= 1; j--)
                for (k = 0, p = 1; k < 9; k++, p = (1<<k))
                    if (i+p-1<NMAX && j+p-1<NMAX)
                       Q[i][j][k+1] = MAX( MAX(Q[i][j][k], Q[i+p][j+p][k]), MAX(Q[i+p][j][k], Q[i][j+p][k]) );
                       
        freopen("plantatie.out", "w", stdout);
        while (M--)
        {
                scanf("%d%d%d", &i, &j, &k);
                p = 1; e = 0;
                while ((p<<1)<=k) p = p<<1, e++;
                printf("%d\n", MAX( MAX(Q[i][j][e], Q[i][j+k-p][e]), MAX(Q[i+k-p][j][e], Q[i+k-p][j+k-p][e]) ));
        }
}

int main()
{
        read();
        solve();
        return 0;
}