Cod sursa(job #2374059)

Utilizator AlexTudorAlex Brinza AlexTudor Data 7 martie 2019 16:46:05
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 kb
#include <bits/stdc++.h>
using namespace std;

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

const int NMAX=100005;

int lg[NMAX];

int rmq[18][NMAX];

int N,M;

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

void precalc()
{
    for(int i=1;(1<<i)<=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 read()
{
    fin>>N>>M;

    for(int i=1;i<=N;++i) fin>>rmq[0][i];
}

void DO()
{
    loga();
    precalc();

    int lgint,logg,st,dr;

    for(int i=1;i<=M;++i)
    {
        fin>>st>>dr;

        lgint=dr-st+1;
        logg=lg[lgint];

        fout<<min(rmq[logg][st] , rmq[logg][dr - (1 << logg) +1])<<"\n";
    }
}

int main()
{
    read();
    DO();
    return 0;
}