Cod sursa(job #2718245)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 8 martie 2021 16:49:59
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int LogMax = 16, NMax = 1e5;

int n, m;
int lg[NMax + 5], rmq[LogMax + 5][NMax + 5];

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

void CalculateLogarithms(){
    for (int i = 2; i <= n; i++)
        lg[i] = lg[i / 2] + 1;
}

void RangeMinimumQuery(){
    for (int i = 1; i <= lg[n]; 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 length = y - x + 1;
        fout << min(rmq[lg[length]][x], rmq[lg[length]][y - (1 << lg[length]) + 1]) << '\n';
    }
}

int main(){
    Read();
    CalculateLogarithms();
    RangeMinimumQuery();
    Print();
    return 0;
}