Cod sursa(job #2305948)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 21 decembrie 2018 12:54:29
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <stdio.h>

using namespace std;

#define NMAX 100000
#define LOGMAX 20

int v [ NMAX + 1 ] ;
int rmq [ NMAX + 1 ] [ LOGMAX ] ;

void Rmq ( int n ) {
  int i, j ;
  for (i = 0 ; i < n ; i++ )
    rmq[i][0] = i ;
  for (j = 1 ; (1 << j) <= n ; j++ ) {
    for (i = 0 ; i + (1 << j) - 1 < n ; i++ )
      if (v[rmq[i][j-1]] < v[rmq[i+(1<<(j-1))][j-1]] )
        rmq[i][j] = rmq[i][j-1] ;
      else
        rmq[i][j] = rmq[i+(1<<(j-1))][j-1] ;
  }
}

int log (int n ) {
  int r, p ;
  r = 1 ;
  p = 0 ;
  while (r < n ) {
    r *= 2 ;
    p++;
  }
  return (p-1) ;
}

int main() {

  FILE *fin, *fout ;
  fin = fopen ("rmq.in", "r" ) ;
  fout = fopen ("rmq.out", "w" ) ;
  int n, i, m, j, k, a, b ;
  fscanf (fin, "%d%d", &n, &m ) ;
  for (i = 0 ; i < n ; i++ )
    fscanf (fin, "%d", &v[i] ) ;
  Rmq(n) ;
  for (i = 0 ; i < m ; i++ ) {
    fscanf (fin, "%d%d", &a, &b ) ;
    b--, a--;
    k = log (b-a+1) ;
    if (v[rmq[a][k]] <= v[rmq[b-(1<<k)+1][k]] )
      fprintf (fout, "%d\n", v[rmq[a][k]]) ;
    else
      fprintf (fout, "%d\n", v[rmq[b-(1<<k)+1][k]]) ;
  }
  return 0;
}