Cod sursa(job #2300052)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 10 decembrie 2018 19:53:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>

using namespace std;

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

const int K = 20;
const int NMAX = 100005;

int N;
int a[NMAX];
int mat[ NMAX ][ K ];
int lg[ NMAX ];

int nr_q;

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

  for( int i = 1; i <= N; ++i )
    mat[i][0] = a[i];

  for( int j = 1; j <= K; ++j )
   for( int i = 1; i + ( 1 << j ) - 1 <= N; ++i )
     mat[i][j] = min( mat[i][j - 1], mat[ i + ( 1 << ( j - 1 ) )][j - 1] );

  /*for( int i = 1; i <= N; ++i )
  {
    for( int j = 0; j <= K; ++j )
      fout << mat[i][j] << ' ';

    fout << '\n';
  }*/
}

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

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

  Pre();
}

void Do()
{
  int lf, rg;
  int lg_dist;

  for( int i = 1; i <= nr_q; ++i )
  {
    fin >> lf >> rg;

    lg_dist = lg[rg - lf + 1];

    fout << min( mat[lf][ lg_dist ], mat[rg - ( 1 << lg_dist ) + 1][ lg_dist ] ) << '\n';
  }

  fout.close();
}

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

    return 0;
}