Cod sursa(job #18039)

Utilizator dominoMircea Pasoi domino Data 17 februarie 2007 23:36:50
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <assert.h> 


#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++)
#define max(a, b) ((a) > (b) ? (a) : (b))

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);
    assert(1 <= N && N <= 500);
    assert(1 <= M && M <= 75000);
    FOR (i, 1, N+1) 
    {
        fgets(buf, sizeof(buf), stdin);
        ptr = buf;
        FOR (j, 1, N+1) A[i][j] = get();
        FOR (j, 1, N+1) assert(0 <= A[i][j] && A[i][j] <= 1000000000);
    }

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