Cod sursa(job #2955629)

Utilizator SerbanCaroleSerban Carole SerbanCarole Data 17 decembrie 2022 14:39:13
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

const int MAX = 1e5 + 1;

int rmq[18][MAX] , n , m , log[MAX];

//rmq[i][j] = minimul din intervalul care se termina cu j si are lungimea =
// 2 la puterea i

void preproc(){

    log[1] = 0;

    for(int i = 2 ; i <= n ; i++){

        log[i] = log[i/2] + 1;
    }

    for(int i = 1 ; i <= log[n] ; i++){

        for(int j = n ; j >= (1 << i) ; j--){

            rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j-(1 << (i-1))]);
        }

    }

}

void query(){

    int a , b;

    cin >> a >> b;

    int val = b - a + 1;

    int l = log[val];

    int p = (1<<l);

    cout << min(rmq[l][b],rmq[l][a+p]) << '\n';

}

int main()
{

    cin >> n >> m;

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

    preproc();

    while(m--) query();

    return 0;
}