Cod sursa(job #1977905)

Utilizator EmplopiStefan Nitu Emplopi Data 6 mai 2017 13:46:08
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>

int logg[501], r[501][501][10];

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

int intreb(int i, int j, int x){
    int l=logg[x], i2=i+x-1, j2=j+x-1;
    return maxim(maxim(r[i2][j2][l], r[i+(1<<l)-1][j2][l]), maxim(r[i2][j+(1<<l)-1][l], r[i+(1<<l)-1][j+(1<<l)-1][l]));
}

int main(){
    FILE *fin, *fout;
    int n, m, k, i, j, x, y;
    fin=fopen("plantatie.in", "r");
    fout=fopen("plantatie.out", "w");
    fscanf(fin, "%d%d", &n, &m);
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            fscanf(fin, "%d", &r[i][j][0]);
            printf("%d ", r[i][j][0]);
        }
        printf("\n");
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            for(k=1;(1<<k)<=i && (1<<k)<=j;k++)
                r[i][j][k]=maxim(maxim(r[i][j][k-1], r[i-(1<<(k-1))][j][k-1]), maxim(r[i][j-(1<<(k-1))][k-1], r[i-(1<<(k-1))][j-(1<<(k-1))][k-1]));
    logg[1]=0;
    for(i=2;i<=500;i++)
        logg[i]=1+logg[i/2];
    for(i=0;i<m;i++){
        fscanf(fin, "%d%d%d", &x, &y, &k);
        fprintf(fout, "%d\n", intreb(x, y, k));
    }
    fclose(fin);
    fclose(fout);

    return 0;
}