Cod sursa(job #2664836)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 29 octombrie 2020 15:51:23
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100005;

int N, Q;
int rmq[NMAX][18];
int lg[NMAX];

void Do() {
    for( int j = 1; ( 1 << j ) <= N; ++j )
        for( int i = 1; i <= N - ( 1 << j ) + 1; ++i )
            rmq[i][j] = min( rmq[i][j - 1], rmq[i + ( 1 << ( j - 1 ))][j - 1] );

    for( int i = 2; i <= N; ++i )
        lg[i] = lg[i / 2] + 1;
}

int Query( int lf, int rg ) {
    int dist = rg - lf + 1;

    return min( rmq[lf][lg[dist]], rmq[rg - ( 1 << lg[dist] ) + 1][lg[dist]] );
}

void Read()
{
    fin >> N >> Q;
    for( int i = 1; i <= N; ++i )
        fin >> rmq[i][0];

    Do();
    for( int i = 1; i <= Q; ++i ) {
        int lf, rg;

        fin >> lf >> rg;
        fout << Query( lf, rg ) << '\n';
    }
}

int main()
{
    Read();
    Do();

    return 0;
}