Cod sursa(job #2253281)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 3 octombrie 2018 20:43:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define maxn 100000
#define maxl 17

using namespace std;

int v[maxn+5];
int dp[maxl+5][maxn+5];

int getint ( bool pin, int n )
{
  int lg = log ( n ) / log ( 2 );
  if ( pin == 0 && (1<<lg) < n )
    lg++;
  return lg;
}

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

  int n, m;

  fin >> n >> m;

  int i, j, lg = getint ( 0, n );

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

  for ( i = 0; i <= lg; i++ )
    for ( j = 0; j < n; j++ )
      dp[i][j] = INT_MAX;

  /// primul rand
  for ( i = 0; i < n; i++ )
    dp[0][i] = v[i];

  for ( i = 1; i <= lg; i++ )
    for ( j = 0; j + (1<<i) - 1 < n; j++ )
      dp[i][j] = min ( dp[i-1][j], dp[i-1][j+(1<<(i-1))] );

  int lo, hi, ile;
  /// query
  for ( ; m > 0; m-- )
  {
    fin >> lo >> hi;
    lo--; hi--;
    ile = getint ( 1, hi - lo + 1 );
    fout << min ( dp[ile][lo], dp[ile][hi-(1<<ile)+1] ) << '\n';
  }

  fin.close ();
  fout.close ();

  return 0;
}