Cod sursa(job #2257828)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 10 octombrie 2018 15:55:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define maxn 100000
#define maxl 17

using namespace std;

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

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

int query ( int lo, int hi )
{
  int ile = getlog2 ( 1, hi - lo + 1 );
  return min ( dp[ile][lo], dp[ile][hi-(1<<ile)+1] );
}

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

  int n, t;

  fin >> n >> t;

  int i;

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

  int lg = getlog2 ( 0, n ), j;

  for ( i = 0; i <= lg; i++ )
    for ( j = 0; j < n; j++ )
      dp[i][j] = INT_MAX;
  /// linia 0
  for ( i = 0; i < n; i++ )
    dp[0][i] = v[i];
  /// precalc
  for ( i = 1; i <= lg; i++ )
    for ( j = 0; j < n; j++ )
      dp[i][j] = min ( dp[i-1][j], dp[i-1][j+(1<<(i-1))] );

  int lo, hi;
  for ( i = 0; i < t; i++ )
  {
    fin >> lo >> hi;
    fout << query ( lo - 1, hi - 1 ) << '\n';
  }

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

  return 0;
}