Cod sursa(job #2743989)

Utilizator ptlsebiptl sebi ptlsebi Data 23 aprilie 2021 19:47:18
Problema Plantatie Scor 10
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <stdio.h>
#include <stdint.h>

void read_uint32_t(FILE *__restrict stream, uint32_t *__restrict nr) {
    uint8_t ch;
    *nr = 0;
    while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
        *nr *= 10;
        *nr += ch - '0';
    }
    if (ch == '\r') {
        fgetc(stream);
    }
}

uint32_t n, q;

uint32_t a[501][501];
uint32_t l2[501];

uint32_t r[8][501][501];

uint32_t max4(uint32_t o1, uint32_t o2, uint32_t o3, uint32_t o4) {
    o1 = o1 > o2 ? o1 : o2;
    o1 = o1 > o3 ? o1 : o3;
    return o1 > o4 ? o1 : o4;
}

void prep() {
    l2[1] = 0;
    uint32_t i, j, k, lat;
    for (i = 2; i <= n; ++i) {
        l2[i] = 1 + l2[i >> 1];
    }
    for (i = 1; i <= l2[n]; ++i) {
        lat = (1 << (i - 1));
        for (j = 1; j < n; ++j) {
            if (lat <= j) {
                for (k = 1; k < n; ++k) {
                    if (lat <= k) {
                        r[i][j][k] = max4(r[i - 1][j][k], r[i - 1][j - lat][k], r[i - 1][j][k - lat],
                                          r[i - 1][j - lat][k - lat]);
                    }
                }
            }
        }
    }
}

uint32_t gmax(uint32_t l, uint32_t y, uint32_t x) {
    uint32_t ll = l > 1 ? l2[l] - 1 : 0;
    --l;
    return max4(r[ll][y + l][x + l], r[ll][y][x + l], r[ll][y + l][x], r[ll][y][x]);
}

int main() {
    {
        FILE *__restrict in = fopen("plantatie.in", "r");

        fscanf(in, "%u %u", &n, &q);
//        read_uint32_t(in, &n);
//        read_uint32_t(in, &q);

        {
            int32_t i, j;
            for (i = 0; i < n; ++i) {
                for (j = 0; j < n; ++j) {
                    fscanf(in, "%u", a[i]+ j);
//                    read_uint32_t(in, a[i] + j);
                    r[0][i][j] = a[i][j];
                }
            }
        }

        prep();

        {
            FILE *__restrict out = fopen("plantatie.out", "w");
            int32_t i;
            uint32_t l, y, x;
            for (i = 0; i < q; ++i) {
                fscanf(in, "%u %u %u", &y, &x, &l);
//                read_uint32_t(in, &y);
//                read_uint32_t(in, &x);
//                read_uint32_t(in, &l);
                fprintf(out, "%u\r\n", gmax(l, y - 1, x - 1));
            }
            fclose(out);
        }

        fclose(in);
    }
    return 0;
}