Cod sursa(job #2862934)

Utilizator cezar.balutaCezar Baluta cezar.baluta Data 6 martie 2022 01:30:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
/*
                         __
                   _.--""  |
    .----.     _.-'   |/\| |.--.
    |    |__.-'   _________|  |_)  _______________
    |  .-""-.""""" ___,    `----'"))   __   .-""-.""""--._
    '-' ,--. `    |Cezar| .---.       |:.| ' ,--. `      _`.
     ( (    ) ) __|  7  |__\\|// _..-- \/ ( (    ) )--._".-.
      . `--' ;\__________________..--------. `--' ;--------'
       `-..-'                               `-..-'
*/
#include <iostream>
#include <fstream>

using namespace std;

const int N = 1e5 + 5;
const int LOG = 18;
int dp[N][LOG], log_2[N];

int min_interval(int a, int b){
    int lungime = b-a+1;
    int log_lungime_interval = log_2[lungime];
    int primul_interval = dp[a][log_lungime_interval];
    int al_doilea_interval = dp[b-(1<<log_lungime_interval)+1][log_lungime_interval];
    return min(primul_interval,al_doilea_interval);
}

int main() {
    ifstream in("rmq.in");
    ofstream out("rmq.out");
    int n,m,a,b;
    in>>n>>m;
    for(int i = 0;i < n;i++){
        in>>dp[i][0];
    }
    for(int i=2;i<=n;i++){
        log_2[i] = log_2[i/2]+1;
    }
    for(int i=1;i<LOG;i++){
        for(int j=0;j + (1<<i)-1 <n;j++){
            dp[j][i] = min(dp[j][i-1],dp[j + (1<<(i-1))][i-1]);
        }
    }
    while(m--){
        in>>a>>b;
        out<<min_interval(a-1,b-1)<<'\n';
    }
    return 0;
}