Cod sursa(job #1694932)

Utilizator sucureiSucureiRobert sucurei Data 26 aprilie 2016 12:07:18
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include<stdio.h>
#define MAXN 505
FILE *f=fopen("plantatie.in","r"), *g=fopen("plantatie.out","w");

int N, logN, Q, RMQ[10][MAXN][MAXN], log[MAXN], doi[10];

int Max2( int A, int B ){ if(A>B) return A; return B; }
int Max( int A, int B, int C, int D ){ return Max2( Max2(A,B), Max2(C,D) ); }

void Citire(){
int i, j;

    fscanf(f,"%d %d\n",&N,&Q);

    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            fscanf(f,"%d",&RMQ[0][i][j]);

    for(i=2;i<=MAXN-1;i++)
        log[i] = log[i/2] + 1;

    doi[0] = 1;
    for(i=1;i<=9;i++)
        doi[i] = doi[i-1] * 2;

    logN = log[N];

}

void CreareRMQ(){
int k, i, j, l;

    for(k=1;k<=logN;k++){

        l=doi[k];
        for(i=1;i<=N-l+1;i++)
            for(j=1;j<=N-l+1;j++)
                RMQ[k][i][j] = Max( RMQ[k-1][ i ]      [ j ],
                                    RMQ[k-1][ i+(l/2) ][ j ],
                                    RMQ[k-1][ i ]      [ j+(l/2) ],
                                    RMQ[k-1][ i+(l/2) ][ j+(l/2) ] );

    }

}

void Rezolvare(){
int q, x, y, L, logL, doiL;

    for(q=1;q<=Q;q++){

        fscanf(f,"%d %d %d\n",&x,&y,&L);

        logL = log[L];
        doiL = doi[logL];

        fprintf(g,"%d\n", Max( RMQ[logL][x][y],
                               RMQ[logL][x+L-doiL][y],
                               RMQ[logL][x][y+L-doiL],
                               RMQ[logL][x+L-doiL][y+L-doiL] ) );

    }

}

int main(){

    Citire();
    CreareRMQ();
    Rezolvare();

return 0;
}