Cod sursa(job #1762468)

Utilizator andra1782Andra Alazaroaie andra1782 Data 23 septembrie 2016 16:14:06
Problema Plantatie Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <stdlib.h>
int r[501][501][20],log[501];

int max(int a, int b, int c, int d){
    int maxim=a;

    if(b>maxim)
        maxim=b;
    if(c>maxim)
        maxim=c;
    if(d>maxim)
        maxim=d;
    return maxim;
}

int main(){
    FILE *fin=fopen("plantatie.in","r");
    FILE *fout=fopen("plantatie.out","w");
    int n,m,i,j,k,a,b,rez,l;

    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]);
            for(k=1; (1<<k)<=i && (1<<k)<=j; k++)
                r[i][j][k]=max(r[i][j][k-1], r[i][j-(1<<(k-1))][k-1],
                               r[i-(1<<(k-1))][j][k-1], r[i-(1<<(k-1))][j-(1<<(k-1))][k-1]);
        }
    for(i=2; i<=n; i++)
        log[i]=1+log[i/2];
    for(i=0; i<m; i++){
        fscanf(fin,"%d%d%d",&a,&b,&k);
        l=log[k];
        rez=max(r[a+(1<<l)-1][b+(1<<l)-1][l], r[a+(1<<l)-1][b+k-1][l],
                r[a+k-1][b+k-1][l], r[a+k-1][b+(1<<l)-1][l]);
        fprintf(fout,"%d\n",rez);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}