Cod sursa(job #2748954)

Utilizator richardbaczur1Baczur Richard richardbaczur1 Data 4 mai 2021 13:29:41
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#define min(x, y) ((x) < (y)) ? (x) : (y)
#define LMAX 18
#define NMAX 100005
#define infile "rmq.in"
#define outfile "rmq.out"

int n, m, l, r;
int lg[NMAX], st[LMAX][NMAX], v[NMAX];
int main()
{
    freopen(infile, "r", stdin);
    freopen(outfile, "w", stdout);

    scanf("%d %d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", v + i);
    }

    lg[1] = 0;
    for (int i = 2; i <= n; ++i)
        lg[i] = lg[i / 2] + 1;

    for (int i = 1; i <= n; ++i)
    {
        st[0][i] = v[i];
    }

    for (int i = 1; (1 << i) <= n; ++i)
    {
        for (int j = 1; j <= n - (1 << i) + 1; ++j)
        {
            l = 1 << (i - 1);
            st[i][j] = min(st[i - 1][j], st[i - 1][j + l]);
        }
    }

    for (int i = 0; i < m; ++i)
    {
        scanf("%d %d", &l, &r);

        int j = lg[r - l + 1];
        int sh = (r - l + 1) - (1 << j);
        int minim = min(st[j][l], st[j][l + sh]);

        printf("%d\n", minim);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}