Cod sursa(job #754866)

Utilizator elfusFlorin Chirica elfus Data 3 iunie 2012 21:12:55
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
#define NMAX (1 << 9)

int x[NMAX][NMAX], RM[10][NMAX][NMAX];

inline int max(int A, int B)
{
    return A > B ? A : B;
}

void PreprocessRMQ2D(int N)
{
    int i, j, k;

    for (i = 1; i <= N; i ++)
        for (j = 1; j <= N; j ++)
            RM[0][i][j] = x[i][j];

    for (k = 1; (1 << k) <= N; k ++)
        for (i = 1; i <= N; i ++)
            for (j = 1; j <= N; j ++)
            {
                if (i + (1 << k) - 1 > N || j + (1 << k) - 1 > N)
                    break;
                RM[k][i][j] = RM[k - 1][i][j];
                RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i + (1 << (k - 1))][j]);
                RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i][j + (1 << (k - 1))]);
                RM[k][i][j] = max(RM[k][i][j], RM[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]);
            }
}

int Lg[NMAX];

void PreprocessLog(int N)
{
    int i;

    Lg[1] = 0;
    for (i = 2; i <= N; i ++)
        Lg[i] = Lg[i / 2] + 1;
}

int Query(int x0, int y0, int K)
{
    int le = Lg[K], sol;

    sol = RM[le][x0][y0];
    sol = max(sol, RM[le][x0 + K - (1 << le)][y0]);
    sol = max(sol, RM[le][x0][y0 + K - (1 << le)]);
    sol = max(sol, RM[le][x0 + K - (1 << le)][y0 + K - (1 << le)]);

    return sol;
}

int main()
{
    int i, j, N, K, M, x0, y0;

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

    scanf("%d%d", &N, &M);

    for (i = 1; i <= N; i ++)
        for (j = 1; j <= N; j ++)
            scanf("%d", &x[i][j]);

    PreprocessLog(N);
    PreprocessRMQ2D(N);

    for (i = 1; i <= M; i ++)
    {
        scanf("%d%d%d", &x0, &y0, &K);
        printf("%d\n", Query(x0, y0, K));
    }

    return 0;
}