Cod sursa(job #2376257)

Utilizator davidbejenariu2David Bejenariu davidbejenariu2 Data 8 martie 2019 14:31:58
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
#define N 100005

using namespace std;

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

int n, nrq;
int v[N];

int d[30][N];
int lg[N];

void rmq_gen()
{
    int i, j;
    int a, b;

    lg[2] = 1;
    for ( i = 3; i <= n; ++i )
         lg[i] = lg[i/2] + 1;

    for ( i = 1; i <= n; ++i )
         d[0][i] = i;

    for ( i = 1; ( 1 << i ) <= n; ++i )
         for ( j = 1; j + ( 1 << i ) - 1 <= n; ++j )
         {
             a = d[ i - 1 ][ j ];
             b = d[ i - 1 ][ j + ( 1 << ( i - 1 ) ) ];

             if ( v[a] < v[b] ) d[i][j] = a;
             else d[i][j] = b;
         }
}

int rmq( int x, int y )
{
    if ( x > y ) swap( x, y );

    int range = y - x + 1;
    int k = lg[range];

    return min( v[ d[k][x] ], v[ d[k][ y - ( 1 << k ) + 1 ] ] );
}

void read()
{
    int i, x, y;

    fin >> n >> nrq;

    for ( i = 1; i <= n; ++i )
         fin >> v[i];

    rmq_gen();

    for ( i = 1; i <= nrq; ++i )
    {
        fin >> x >> y;

        fout << rmq( x , y ) << '\n';
    }

    fin.close();
}

int main()
{
    read();

    fout.close();

    return 0;
}