Cod sursa(job #1801885)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 9 noiembrie 2016 18:10:13
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int NMAX = 100000;
const int LMAX = 16;

int v[NMAX + 5], rmq[LMAX + 5][NMAX + 5];;

int pow2_exp ( int a ) {
  int p2, k = -1;
  for ( p2 = 1 ; p2 < a ; p2 *= 2 )
      ++k;
  return k;
}

int main() {

  freopen ( "rmq.in", "r", stdin );
  freopen ( "rmq.out", "w", stdout );

  int n, m, x, y, l, poz;

  scanf ( "%d%d", &n, &m );
  for ( register int i = 1 ; i <= n ; ++i ) {
    scanf ( "%d", &v[i] );
    rmq[0][i] = v[i];
  }

  for ( register int i = 1 ; ( 1 << i ) <= n ; ++i ) {
    for ( register int j = 1; j + ( 1 << i ) - 1 <= n ; ++j ){
      l = 1 << ( i - 1 );
      rmq[i][j] = min ( rmq[i - 1][j], rmq[i - 1][j + l] );
    }
  }

  for ( register int i = 1 ; i <= m ; ++i ) {
    scanf ( "%d%d", &x, &y );
    l = pow2_exp ( y - x + 1 );
    poz = y - x + 1 - ( 1 << l );
    printf ( "%d\n", min ( rmq[l][x], rmq[l][x + poz] ) );
  }

  return 0;
}