Cod sursa(job #2805857)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 02:43:52
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb

#include <cstdio>
#define N 100002
#include <iostream>

using namespace std;
FILE* f, * g;

int log[N], pd[20][N];

int main()
{
    f = fopen("rmq.in", "r");
    g = fopen("rmq.out", "w");
    int n, m;
    fscanf(f, "%d %d", &n, &m);
    int x;
    log[0] = -1;
    for (int i = 1;i <= n;++i)
    {
        fscanf(f, "%d", &pd[0][i]);
        log[i] = 1 + log[i / 2];
    }
    int poz;
    ///in pd[i][j] va fi valoarea minima din intervalul (j, j + 2^i - 1)
    for (int i = 1;i <= log[n];++i)
    {
        poz = (1 << (i - 1));
        for (int j = 1;j + poz <= n;++j)
            pd[i][j] = min(pd[i - 1][j], pd[i - 1][j + poz]);
    }
    int a, b, dif, val, lin;
    for (int i = 1;i <= m;++i)
    {
        fscanf(f, "%d %d", &a, &b);
        dif = b - a + 1;
        lin = log[dif];
        poz = (1 << lin);
        val = min(pd[lin][a], pd[lin][b - poz + 1]);
        fprintf(g, "%d\n", val);
    }
    fclose(f);
    fclose(g);
    return 0;
}