Cod sursa(job #1197725)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 13 iunie 2014 15:56:54
Problema Plantatie Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <stdio.h>
#define MAXN 500
#define LOGN 8
int rmq[LOGN+1][MAXN+1][MAXN+1];
int lg[MAXN+1];
inline int max2(int a, int b){
    if(a>=b){
        return a;
    }
    return b;
}
inline int max4(int a, int b, int c, int d){
    return max2(max2(a, b), max2(c, d));
}
int main(){
    int n, q, i, j, l, k, iJum, jJum, add, a;
    FILE *fin, *fout;
    fin=fopen("plantatie.in", "r");
    fout=fopen("plantatie.out", "w");
    fscanf(fin, "%d%d", &n, &q);
    for(i=1; i<=n; i++){
        for(j=1; j<=n; j++){
            fscanf(fin, "%d", &rmq[0][i][j]);
        }
    }
    k=0;
    for(i=1; i<=n; i++){
        if(i>=(2<<k)){
            k++;
        }
        lg[i]=k;
    }
    for(l=1; l<=lg[n]; l++){
        for(i=1; i<=n; i++){
            for(j=1; j<=n; j++){
                if((i>(1<<(l-1)))&&(j>=(1<<(l-1)))){
                    iJum=i-(1<<(l-1));
                    jJum=j-(1<<(l-1));
                    rmq[l][i][j]=max4(rmq[l-1][i][j], rmq[l-1][iJum][j], rmq[l-1][i][jJum], rmq[l-1][iJum][jJum]);
                }
            }
        }
    }
    for(a=1; a<=q; a++){
        fscanf(fin, "%d%d%d", &i, &j, &k);
        add=(1<<(lg[k]))-1;
        fprintf(fout, "%d\n", max4(rmq[lg[k]][i+k-1][j+k-1], rmq[lg[k]][i+add][j], rmq[lg[k]][i][j+add], rmq[lg[k]][i+add][j+add]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}