Cod sursa(job #2788320)

Utilizator TghicaGhica Tudor Tghica Data 25 octombrie 2021 15:36:17
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <algorithm>

#define NMAX 100002
#define LMAX 18

using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

int rmq[LMAX][NMAX];

int main() {
  int i, j, n, m, lgCur, cop, a, b, put2, k, mn;
  cin>>n>>m;

  for( i = 1; i <= n; i++ ) {
    cin>>rmq[1][i];
  }

  cop = n;
  lgCur = 1;
  while( cop ) {
    cop /= 2;
    lgCur++;
  }
  for( i = 0; i <= lgCur; i++ )
    rmq[0][i] = 2100000000;
  for( i = 0; i <= n; i++ )
    rmq[i][0] = 2100000000;
  for( i = 2; i < lgCur; i++ ) {
    for( j = 1; j <= n - ( 1 << ( i - 1 ) ) + 1; j++ ) {
      rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + ( 1 << ( i - 2 ) )] );
    }
  }
  for( i = 1; i <= m; i++ ) {
    cin>>a>>b;
    put2 = 1;
    k = 1;
    while( put2 <= b - a ) {
      put2 *= 2;
      k++;
    }
    mn = 2100000000;
    while( a <= b ) {
      if( put2 <= b - a + 1 ) {
        if( rmq[k][a] < mn )
          mn = rmq[k][a];
        a += put2;
      }
      put2 /= 2;
      k--;
    }
    cout<<mn<<"\n";
  }
  return 0;
}