Cod sursa(job #2623580)

Utilizator euyoTukanul euyo Data 3 iunie 2020 14:16:23
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
#include <math.h>
#define MAXLOG 17
#define MAXN 100000
#define min( a, b ) a < b ? a : b

int v[MAXN];

int minRange[MAXLOG][MAXN];

int main() { 
  FILE *fin = fopen( "rmq.in", "r" );
  FILE *fout = fopen( "rmq.out", "w" );
  int n, m, i, st, dr, lg, k, j;
  
  fscanf( fin, "%d%d", &n, &m );
  for ( i = 0; i < n; ++i ) {
	fscanf( fin, "%d", &v[i] ); 
  }
  for ( i = 0; i < n; ++i ) {
	minRange[0][i] = v[i];
  }
  lg = (int)log2( n );
  for ( i = 1; i <= lg; ++i ) {
	for ( j = 0; j + (1 << (i - 1)) < n; ++j ) {
      minRange[i][j] = min( minRange[i - 1][j], minRange[i - 1][j + (1 << (i - 1))] );
	}
  }
  for ( i = 0; i < m; ++i ) {
	fscanf( fin, "%d%d", &st, &dr );
	--st;
	--dr;
    k = (int)log2( dr - st + 1 );
	fprintf( fout, "%d\n", min( minRange[k][st], minRange[k][dr - (1 << k) + 1] ) );
  }
  fclose( fin );
  fclose( fout );
  return 0;
}