Cod sursa(job #2817769)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 14 decembrie 2021 10:41:48
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#define LOG 17
#define NMAX 100000
using namespace std;

int v[NMAX + 1];
int rmq[NMAX + 1][LOG];
int logg[LOG];

inline int min (int a, int b){
    return a < b ? a : b;
}

void prec_log2 (int x ){
    logg[1] = 0;
    for (int i = 2; i < x; i++){
        logg[i] = logg[i / 2] + 1;
   }

}

int main(){

    ifstream fin ("rmq.in");
    ofstream fout ("rmq.out");

    int n, m;

    fin >> n >> m;
    for (int i = 0; i < n; i++)
        fin >> v[i];
    for (int i = 0; i < n; i++)
        rmq[i][0] = v[i];

    for (int p = 1; (1 << p) <= n; p++){
        for (int i = 0; i + (1 << p) - 1 < n; i++){
            rmq[i][p] = min ( rmq[i][p - 1], rmq[i + (1 << (p - 1))][p - 1]);
        }
    }

    prec_log2 (n);
    int left, right;
    int x , y;
    for (int i = 0; i < m; i++){

        fin >> x >> y;
        left = x - 1;
        right = y - 1;

        fout << min (rmq[left][logg[right - left + 1]], rmq[right - (1 << logg[right - left + 1]) + 1][logg[right - left + 1]]) << "\n" ;

    }
    return 0;
}