Cod sursa(job #2818554)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 16 decembrie 2021 14:43:27
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 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--;

    fprintf( fout, "%d\n", f(tabel[a - 1][p], tabel[b - 1 - p][p]) );
  }

  fclose( fin );
  fclose( fout );
  return 0;
}