Cod sursa(job #1006192)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 6 octombrie 2013 15:53:32
Problema Plantatie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>

#define Nmax 512
#define inf 0x3f3f3f3f

using namespace std;

int N, M, a[Nmax][Nmax], lg[Nmax], p[Nmax], v[Nmax][Nmax][10];

inline int max(int a, int b, int c = inf, int d = inf){

    int m = a;

    if(b > m)
        m = b;
    if(c > b)
        m = c;
    if(d > m)
        m = d;

    return m;
}
int main(){

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

    scanf("%d%d",&N,&M);

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

     
    lg[1] = 0;
    int pw = 1;

    for(int i = 1; i <= N; ++i){

        lg[i] = lg[i - 1];

        if( i > pw ){
            lg[i]++;
            pw *= 2;
        }
    }


    //Precalculam
    //v[i][j][k] -> coltul in i,j, lungime latura k
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            v[i][j][0] = a[i][j];

    pw = 2;
    p[0] = 1;
    for(int k = 1; pw <= N; k++, pw*=2){
        for(int i = 1; i <= N - pw + 1; ++i)
            for(int j =1; j <= N - pw + 1; ++j){
                int lastPow = pw/2;

                v[i][j][k] = max( v[i][j][k-1], v[i+lastPow][j][k-1], v[i][j+lastPow][k-1], v[i+lastPow][j+lastPow][k-1] );

            }
        p[k] = pw;
    }

    //Query-uri
    for(int i = 1; i <= M; ++i){

        int x, y, k;

        scanf("%d%d%d",&x,&y,&k);

        int log = lg[k] - 1;

        int sol = max( v[x][y][log], v[x + k - p[log]][y][log], v[x][y + k - p[log]][log], v[x + k - p[log]][y + k - p[log]][log]);

        printf("%d\n", sol);
    }

    return 0;
}