Cod sursa(job #1238826)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 7 octombrie 2014 20:08:15
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#define MAXN 500
#define LOG_N 8
int rmq[LOG_N+1][MAXN+1][MAXN+1], n, lg[MAXN+1];
inline int max4(int a, int b, int c, int d){
    if((a>=b)&&(a>=c)&&(a>=d)){
        return a;
    }
    if((b>=c)&&(b>=d)){
        return b;
    }
    if(c>=d){
        return c;
    }
    return d;
}
inline void precalc_log(){
    int k, i;
    k=0;
    for(i=1; i<=n; i++){
        if(i>=(2<<k)){
            k++;
        }
        lg[i]=k;
    }
}
inline void precalc_rmq(){
    int k, i, j;
    for(k=1; (1<<k)<=n; k++){
        for(i=n; i>0; i--){
            for(j=n; j>0; j--){
                if((i+(1<<(k-1))<=n)&&(j+(1<<(k-1))<=n)){
                    rmq[k][i][j]=max4(rmq[k-1][i][j],rmq[k-1][i+(1<<(k-1))][j],rmq[k-1][i][j+(1<<(k-1))],rmq[k-1][i+(1<<(k-1))][j+(1<<(k-1))]);
                }
            }
        }
    }
}
int main(){
    int i, j, q, k, l, Q;
    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]);
        }
    }
    precalc_log();
    precalc_rmq();
    for(q=0; q<Q; q++){
        fscanf(fin, "%d%d%d", &i, &j, &k);
        l=lg[k];
        fprintf(fout, "%d\n", max4(rmq[l][i][j], rmq[l][i+k-(1<<l)][j], rmq[l][i][j+k-(1<<l)], rmq[l][i+k-(1<<l)][j+k-(1<<l)]));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}