Cod sursa(job #2552646)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 21 februarie 2020 08:06:42
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <climits>

#define N 100001

using namespace std;

ifstream f ( "rmq.in" );
ofstream g ( "rmq.out" );

int Min[N][21], log[N];

int answer ( int x, int y ){
    int MIN = INT_MAX;
    while ( x < y ){
        int p = log[y - x + 1];
        MIN = min ( MIN, Min[x][p] );
        x = x + ( 1 << p ) - 1;
    }
    return MIN;
}

int main()
{   int n, q, i, j, x, y, k = -1;
    f >> n >> q;
    for ( i = 1; i <= n; i++ ){
        f >> x;
        Min[i][0] = x;
    }
    for ( j = 1; ( 1 << j ) <= n; j++ )
        for ( i = 1; i <= n; i++ )
            if ( i + ( 1 << j ) - 1 <= n )
                Min[i][j] = min ( Min[i][j - 1], Min[i + ( 1 << ( j - 1 ) )][j - 1] );
    for ( i = 1; i <= q; i++ ){
        f >> x >> y;
        int nr = y - x + 1;
        int byte = 0, MIN = INT_MAX;
        while ( nr != 0 ){
            if ( nr % 2 == 1 ){
                MIN = min ( MIN, Min[x][byte] );
                x += ( 1 << byte );
            }
            byte++;
            nr = ( nr >> 1 );
        }
        g << MIN << '\n';
    }
    return 0;
}