Cod sursa(job #2374043)

Utilizator serafimalex2001Serafim Alex serafimalex2001 Data 7 martie 2019 16:41:04
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int a[100005];
int lg[100005];
int rmq[20][100005];
int n,k;

void Read()
{
    fin>>n>>k;
    for( int i=1; i<=n; ++i )
        fin>>a[i];
}

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

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

void Do()
{
    int x,y,lgi;
    int logg;
    for(int i=1; i<=k; ++i)
    {
        fin>>x>>y;
        lgi= y - x + 1;
        logg=lg[lgi];

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

int main()
{
    Read();
    LOG();
    Precalc();
    Do();
    return 0;
}