Cod sursa(job #2628214)

Utilizator k2e0e0w3qDumitrescu Gheorghe k2e0e0w3q Data 15 iunie 2020 00:53:38
Problema Plantatie Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#define N 500
#define log(x) 31-__builtin_clz(x)

int max (int a, int b, int c, int d) {return a>=b && a>=c && a>=d ? a:
                                             b>=a && b>=c && b>=d ? b:
                                             c>=a && c>=b && c>=d ? c:
                                                                    d;}
int seg[log(N)+1][N][N];
int main (void) {
    FILE *fin=fopen("plantatie.in", "r"),
         *fout=fopen("plantatie.out", "w");

    int n, m;
    fscanf(fin, "%d%d", &n, &m);

    int i, j, k;
    for (i=0; i<n; ++i)
        for (j=0; j<n; ++j)
            fscanf(fin, "%d", &seg[0][i][j]);
    
    for (k=1; (1<<k) <= n; ++k)
        for (i=0; i + (1<<k) <= n; ++i)
            for (j=0; j + (1<<k) <= n; ++j)
                seg[k][i][j]=max(seg[k-1][i][j], seg[k-1][i][j + (1<<k-1)], seg[k-1][i + (1<<k-1)][j], seg[k-1][i + (1<<k-1)][j + (1<<k-1)]);

    int lg;
    for (; m; m--) {
        fscanf(fin, "%d%d%d", &i, &j, &k);
        --i, --j;
        lg=log(k);
        fprintf(fout, "%d\n", max(seg[lg][i][j], seg[lg][i][j - (1<<lg) + k], seg[lg][i - (1<<lg) + k][j], seg[lg][i - (1<<lg) + k][j - (1<<lg) + k]));
    }
    return 0;
}