Cod sursa(job #2472749)

Utilizator Leonard1998Olariu Leonard Leonard1998 Data 12 octombrie 2019 20:15:39
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
#define NMAX (int)(1e5 + 5)

using namespace std;

int n, q, vec[NMAX] ,l, r;
int rmq[NMAX][20], pMax[NMAX];

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

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

    for (int i = 1; i <= n; ++i)
        scanf("%d", &vec[i]);

    //build RMQ
    for (int i = 1; i <= n; ++i) {
        rmq[i][0] = i;

        //pMax[i] = max x, where 2^x <= i
        if (1 << (pMax[i-1] + 1) <= i)
            pMax[i] = pMax[i-1] + 1;
        else pMax[i] = pMax[i-1];
    }

    for (int i = 1; (1 << i) <= n; ++i) {
        int p = 1 << i;
        int pAdd = 1 << (i-1);

        for (int j = 1; (j - 1) + p <= n; ++j) {
            if (vec[rmq[j][i-1]] < vec[rmq[j + pAdd][i-1]])
                rmq[j][i] = rmq[j][i-1];
            else rmq[j][i] = rmq[j + pAdd][i-1];
        }
    }

    while (q--) {
        scanf("%d %d", &l, &r);

        int dist = r - l  + 1;
        int p = pMax[dist];

        printf("%d\n", min(vec[rmq[l][p]], vec[rmq[l + dist - (1 << p)][p]]));
    }

    return 0;
}