Cod sursa(job #2818831)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 16 decembrie 2021 23:05:05
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
 
#define MAXN 100000
#define LOGN 16
#define INF 1000000
 
inline int min( int a, int b ) {
  return a < b ? a : b;
}
 
int f( int a, int b ) {
  return min(a, b);
}
 
int tabel[MAXN][LOGN + 1];
 
int main() {
  FILE *fin, *fout;
  int n, m, i, p, a, b;
  fin = fopen( "rmq.in", "r" );
  fout = fopen( "rmq.out", "w" );
 
  fscanf( fin, "%d%d", &n, &m );
  for( i = 0; i < n; i++ )
    fscanf( fin, "%d", &tabel[i][0] );
 
  for( p = 1; p <= LOGN; p++ )
    for( i = 0; i < n; i++ )
      tabel[i][p] = f(tabel[i][p - 1], i + (1 << (p - 1)) < n ? tabel[i + (1 << (p - 1))][p - 1] : INF );
 
  for( i = 0; i < m; i++ ) {
    fscanf( fin, "%d%d", &a, &b );
 
    p = 0;
    while( 1 << p <= b - a )
      p++;
    p--;
    if( p == -1 )
      p = 0;
 
    fprintf( fout, "%d\n", f(tabel[a - 1][p], tabel[b - (1 << p)][p]) );
  }
 
  fclose( fin );
  fclose( fout );
  return 0;
}