Cod sursa(job #1349130)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 19 februarie 2015 23:58:45
Problema Plantatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include<stdio.h>
#define MAXN 505
#define MAXlogN 10
FILE *f=fopen("plantatie.in","r"), *g=fopen("plantatie.out","w");

long int N, T, a[MAXN][MAXN], RMQ[MAXN][MAXN][MAXlogN];
long int log2[MAXN], put2[MAXN], log2N;

void Citire(){
long int i, j;

    fscanf(f,"%ld %ld\n",&N,&T);
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            { fscanf(f,"%ld",&a[i][j]); RMQ[i][j][0] = a[i][j]; }
}

void Creare_log2_put2(){
long int i;

    log2[1]=0;
    for(i=2;i<=N;i++)
        log2[i]=log2[i/2]+1;
    log2N = log2[N];

    put2[0]=1;
    for(i=1;i<=log2N;i++)
        put2[i]=put2[i-1]*2;

}

long int Maxim( long int A, long int B, long int C, long int D ){
long int maxim = A;

    if( B > maxim ) maxim = B;
    if( C > maxim ) maxim = C;
    if( D > maxim ) maxim = D;

    return maxim;
}

void Creare_RMQ(){
long int i, j, k, p2k, p2k1;

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

        p2k = put2[k];
        p2k1= put2[k-1];

        for( i=1; i+p2k-1 <= N; i++ )
            for( j=1; j+p2k-1 <= N; j++ )
                RMQ[i][j][k] =
                Maxim(  RMQ[i][j]     [k-1],  RMQ[i+p2k1][j]     [k-1],
                        RMQ[i][j+p2k1][k-1],  RMQ[i+p2k1][j+p2k1][k-1] );
    }

}

void Afisare(){
long int i, x, y, z, p, lgp;

    for(i=1;i<=T;i++){
        fscanf(f,"%ld %ld %ld\n",&x,&y,&z);

        lgp = log2[z]; p = put2[log2[z]];

        fprintf(g,"%ld\n", Maxim(

            RMQ[x][y][lgp],
            RMQ[ x+z-p ][y][lgp],
            RMQ[x][ y+z-p ][lgp],
            RMQ[ x+z-p ][ y+z-p ][lgp]

        ) );

    }

}

int main(){

    Citire();
    Creare_log2_put2();
    Creare_RMQ();
    Afisare();

return 0;
}