Cod sursa(job #3297309)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 13:44:49
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

const int INF = 1e9;

int main() {
  FILE *fin = fopen( "rmq.in", "r" );
  FILE *fout = fopen( "rmq.out", "w" );

  int n, m;
  fscanf( fin, "%d%d", &n, &m );

  std::vector<int> v(n);
  for( int i = 0; i < n; i++ )
    fscanf( fin, "%d", &v[i] );

  std::vector<std::vector<int>> rmq(17, std::vector<int>(n, +INF));
  for( int i = 0; i < n; i++ )
    rmq[0][i] = v[i];

  for( int l = 1; l < (int)rmq.size(); l++ ){
    int half = (1 << (l - 1));
    for( int i = 0; i + half < n; i++ )
      rmq[l][i] = std::min( rmq[l - 1][i], rmq[l - 1][i + half] );
  }

  for( int i = 0; i < m; i++ ){
    int st, dr;
    fscanf( fin, "%d%d", &st, &dr );
    st--; dr--;

    int l = 31 - __builtin_clz( dr - st + 1 );
    fprintf( fout, "%d\n", std::min( rmq[l][st], rmq[l][dr - (1 << l) + 1] ) );
  }

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