Cod sursa(job #22830)

Utilizator filipbFilip Cristian Buruiana filipb Data 27 februarie 2007 17:16:28
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#define max(a, b) ((a > b) ? a : b)
#define NMax 505

int N, S[11][NMax][NMax], lg[NMax];

int main(void)
{
    int M, i, j, x, y, l, k, m1, m2;
    
    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", &S[0][i][j]);

    for (i = 2; i <= N; i++)
        lg[i] = lg[i/2] + 1;
    
    for (k = 1; k <= lg[N]; k++)
        for (x = 1; x <= N-(1<<k)+1; x++)
            for (y = 1; y <= N-(1<<k)+1; y++)
                S[k][x][y] = max(max(S[k-1][x][y], S[k-1][x][y+(1<<(k-1))]),
                                 max(S[k-1][x+(1<<(k-1))][y],
                                     S[k-1][x+(1<<(k-1))][y+(1<<(k-1))]));
    
    for (; M; M--)
    {
        scanf("%d %d %d", &x, &y, &l);
        
        k = lg[l];
        m1 = max(S[k][x][y], S[k][x][y+l-(1<<k)]);
        m2 = max(S[k][x+l-(1<<k)][y], S[k][x+l-(1<<k)][y+l-(1<<k)]);
        printf("%d\n", max(m1, m2));
    }
    
    return 0;
}