Cod sursa(job #2374010)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 7 martie 2019 16:30:26
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int N, M;
int a[NMAX];
int lg[NMAX];
int rmq[20][NMAX];

void Read()
{
  fin >> N >> M;

  for( int i = 1; i <= N; ++i )
    fin >> a[i];
}

void Do()
{
  for( int i = 1; i <= N; ++i )
    rmq[0][i] = a[i];

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

  lg[2] = 1;

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

  int x, y, lgi;
  int logg;

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

    lgi = y - x + 1;
    logg = lg[lgi];

    fout << min( rmq[logg][x], rmq[logg][ y - ( 1 << logg ) + 1 ] ) << '\n';
  }
}

int main()
{
    Read();
    Do();

    return 0;
}