Cod sursa(job #87231)

Utilizator andrei_infoMirestean Andrei andrei_info Data 26 septembrie 2007 21:04:49
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <cstdio>
#include <cstdlib>
#define MAX 500

int N,M, v[MAX][MAX], a[MAX][MAX][10];

inline int max ( int p1, int p2, int p3, int p4)
{
    int rez = p1;
    if ( p2 > rez) rez = p2;
    if ( p3 > rez) rez = p3;
    if ( p4 > rez) rez = p4;

    return rez;
};


void citire()
{
    scanf("%d%d\n", &N, &M);

    for (int i=0; i<N; i++)
        for (int j =0; j<N; j++)
            scanf("%d", &a[i][j][0]);
};

void compute()
{
    for (int k=1; 1<<(k-1) <= N; k++)
       for (int i=0; i<N; i++)
         for (int j=0; j<N; j++)
           if ( i + (1<<(k-1))  < N && j + (1<<(k-1)) < N)

                a[i][j][k] = max(
                                a[i][j][k-1],
                                a[i][j+ (1<<(k-1))][k-1],
                                a[i+(1<<(k-1))][j][k-1],
                                a[i+(1<<(k-1))][j+(1<<(k-1))][k-1]
                                );
              else
                a[i][j][k] = a[i][j][k-1];


};


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

    citire();
    compute();
    for ( ; M>0; M--)
    {
        int i,j,k;
        scanf("%d%d%d\n", &i, &j, &k);
        i--; j--;

        int p = 0;
        for ( ; 1<<(p+1) <= k; p++);

        int rez = max(
                    a[i][j][p],
                    a[i][j+k-(1<<p)][p],
                    a[i+k-(1<<p)][j][p],
                    a[i+k-(1<<p)][j+k-(1<<p)][p]
                    );
        printf("%d\n", rez);
    };

    fclose(stdin);
    fclose(stdout);

    return 0;
};