Cod sursa(job #1689020)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 13 aprilie 2016 21:21:32
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#define DIM 550
#define lgDIM 11
using namespace std;


int v[DIM][DIM][lgDIM];
int log[DIM];

int maxim( int a, int b ){
    if( a < b ) return b;
    return a;
}


int main()
{

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

    int n, m, i, j, s, t, d, k, p;
    int x, y;

    scanf("%d%d",&n,&m);
    for( i = 1; i <= n; ++i ){
        for( j = 1; j <= n; ++j ) scanf("%d",&v[i][j][0]);
    }

    log[1] = 0;
    for( i = 2; i <= n; ++i )
        log[i] = 1 + log[i/2];

    for( k = 1; (1<<k) <= n; ++k ){
        for( i = 1; i + (1<<k) - 1 <= n; ++i ){
            for( j = 1; j + (1<<k) - 1 <= n; ++j ){
                p = 1<<(k-1);
                v[i][j][k] = maxim( maxim( v[i][j][k-1], v[i+p][j+p][k-1] ),
                                    maxim( v[i][j+p][k-1], v[i+p][j][k-1] )
                             );
            }
        }
    }


    for( i = 1; i <= m; ++i ){
        scanf("%d%d%d",&x,&y,&k);
        s = log[k];
        p = k - (1<<s);
        d = maxim( maxim( v[x][y][s], v[x+p][y][s] ),
                   maxim( v[x][y+p][s], v[x+p][y+p][s] )
            );
        printf("%d\n",d);
    }

    return 0;
}