Cod sursa(job #16799)

Utilizator dominoMircea Pasoi domino Data 14 februarie 2007 02:48:29
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>

#define max(a, b) ((a) > (b) ? (a) : (b))

#define MAX_N 512
#define MAX_LG 10
#define FIN "plantatie.in"
#define FOUT "plantatie.out"
#define FOR(i, a, b) for (i = (a); i < (b); i++)

int N, M, A[MAX_N][MAX_N], rmq[MAX_LG][MAX_N][MAX_N], lg[MAX_N];

int main(void)
{
    int i, j, t, p, inc, ret;
    
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d", &N, &M);
    FOR (i, 1, N+1) FOR (j, 1, N+1)
        scanf("%d", A[i]+j);

    FOR (i, 1, N+1) FOR (j, 1, N+1) rmq[0][i][j] = A[i][j];
    for (t = 0; (1<<t) <= N; t++)
    {
        inc = (1<<t);
        FOR (i, 1, N+1) FOR (j, 1, N+1)
        {
            rmq[t+1][i][j] = rmq[t][i][j];
            if (i+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j]);
            if (j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i][j+inc]);
            if (i+inc <= N && j+inc <= N) rmq[t+1][i][j] = max(rmq[t+1][i][j], rmq[t][i+inc][j+inc]);
        }
    }

    for (i = 2, j = 1; i <= N; i++)
    {
        lg[i] = j;
        if ((1<<(j+1)) == i+1) j++;
    }

    for (; M > 0; M--)
    {
        scanf("%d %d %d", &i, &j, &inc);
        t = lg[inc]; p = 1<<t;
        ret = rmq[t][i][j];
        if (j+inc >= p) ret = max(ret, rmq[t][i][j+inc-p]);
        if (i+inc >= p) ret = max(ret, rmq[t][i+inc-p][j]);
        if (i+inc >= p && j+inc >= p) ret = max(ret, rmq[t][i+inc-p][j+inc-p]);
        printf("%d\n", ret);
    }
    
    return 0;
}