Cod sursa(job #16803)

Utilizator dominoMircea Pasoi domino Data 14 februarie 2007 02:51:54
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 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];
char buf[1<<16], *ptr;

inline int get(void)
{
    int n;

    for (n = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
        n = n*10 + *ptr-'0';
    for (; *ptr == ' '; ptr++);
    return n;
}

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

    scanf("%d %d\n", &N, &M);
    FOR (i, 1, N+1) 
    {
        fgets(buf, sizeof(buf), stdin);
        ptr = buf;
        FOR (j, 1, N+1) A[i][j] = get();
    }

    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;
}