Cod sursa(job #2478137)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 21 octombrie 2019 18:09:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int nmax = 100000, valmax = 100000, lgmax = 17;

int log[valmax + 5], rmq[lgmax + 5][nmax + 5], n, m;

void Read(){
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> rmq[0][i];
}

void CalcLog(){
    for (int i = 2; i <= valmax; i++)
        log[i] = log[i / 2] + 1;
}

void Solve(){
    int lg = log[n];
    for (int i = 1; i <= lg; i++)
        for (int j = 1; j + (1 << i) - 1 <= n; j++)
            rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}

void Print(){
    while (m--){
        int x, y;
        fin >> x >> y;
        int l = y - x + 1;
        fout << min(rmq[log[l]][x], rmq[log[l]][y - (1 << log[l]) + 1]) << '\n';
    }
}

int main(){
    Read();
    CalcLog();
    Solve();
    Print();
    return 0;
}