Cod sursa(job #2961578)

Utilizator LORDENVraja Luca LORDEN Data 6 ianuarie 2023 18:45:23
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.93 kb
#include <set>
#include "cmath"
#include "iostream"
#include "algorithm"

using namespace std;

/**ifstream cin("in.in");
ofstream cout("out.out");**/

int n, m, rmq[100002][17], a[100002] ;

void preprocess()
{

    for (int i = 1 ; i <= n ; i ++)
        rmq[i][0] = i ;

    for (int j = 1 ; (1 << j) <= n ; j ++)
        for (int i = 0 ; i + (1 << j) - 1 <= n ; i ++) {
            if (a[rmq[i][j - 1]] < a[rmq[i + (1 << (j - 1))][j - 1]])
                rmq[i][j] = rmq[i][j - 1];

            else
                rmq[i][j] = rmq[i + (1 << (j - 1))][j - 1] ;

        }

}

int Query(int l, int r)
{

    int k = log2(r - l + 1) ;
    return min(a[rmq[l][k]] , a[rmq[r - (1 << k) + 1][k]]) ;

}

int main()
{

    int x, y ;

    cin >> n >> m ;

    for (int i = 1 ; i <= n ; i ++)
        cin >> a[i] ;

    preprocess() ;

    for (int i = 0; i < m; ++i) {
        cin >> x >> y ;

        cout << Query (x, y) << '\n' ;

    }


    return 0 ;

}