Cod sursa(job #2741961)

Utilizator ptlsebiptl sebi ptlsebi Data 19 aprilie 2021 20:25:46
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.66 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, m;

uint32_t a[100001];
uint32_t l2[100001];

uint32_t r[16][100001];

uint32_t min(uint32_t o1, uint32_t o2) {
    return o1 < o2 ? o1 : o2;
}

uint32_t gmin(int32_t st, int32_t dr) {
    uint32_t l = l2[dr - st + 1];
//    fprintf(stdout, "%u - %u \n", r[l][st + (1 << l) - 1], r[l][dr]);
    return min(r[l][st + (1 << l) - 1], r[l][dr]);
}

void pcalc() {
    l2[1] = 0;
    int32_t i, j;
    for (i = 2; i <= n; ++i) {
        l2[i] = 1 + l2[i >> 1];
    }

    for (i = 1; i <= l2[n]; ++i) {
        for (j = 1; j <= n; ++j) {
            if ((1 << (i-1)) <= j) {
                r[i][j] = min(r[i - 1][j - (1 << (i - 1))], r[i - 1][j]);
            }
        }
    }
}

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

        read_uint32_t(in, &n);
        read_uint32_t(in, &m);
        {
            int32_t i;
            for (i = 0; i < n; ++i) {
                read_uint32_t(in, a + i);
                r[0][i] = a[i];
            }
        }
        pcalc();
        {
            FILE *__restrict out = fopen("rmq.out", "w");
            int32_t i;
            uint32_t st, dr;
            for (i = 0; i < m; ++i) {
                read_uint32_t(in, &st);
                read_uint32_t(in, &dr);
                fprintf(out, "%u\n", gmin(st-1, dr-1));
            }
            fclose(out);
        }

        fclose(in);
    }
    return 0;
}