Cod sursa(job #2788361)

Utilizator TghicaGhica Tudor Tghica Data 25 octombrie 2021 16:26:27
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.85 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 lg[LMAX];

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

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

  for( i = 2; i <= n; i++ ) {
    lg[i] = lg[i / 2] + 1;
  }

  cop = n;
  lgCur = 0;
  while( cop ) {
    cop /= 2;
    lgCur++;
  }
  for( i = 1; i <= lgCur; i++ ) {
    for( j = 1; j <= n - ( 1 << ( i - 1 ) ); j++ ) {
      rmq[i][j] = min( rmq[i - 1][j], rmq[i - 1][j + ( 1 << ( i - 1 ) )] );
    }
  }
  for( i = 1; i <= m; i++ ) {
    cin>>a>>b;
    mn1 = rmq[lg[b - a + 1]][a];
    mn2 = rmq[lg[b - a + 1]][b - ( 1 << lg[b - a + 1]) + 1];
    cout<<min( mn1, mn2 )<<"\n";
  }
  return 0;
}