Cod sursa(job #2818128)

Utilizator vladburacBurac Vlad vladburac Data 15 decembrie 2021 12:04:07
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>
#include <algorithm>
using namespace std;
const int MAXN = 1e5;
const int MAXLOG = 17;

int logg[MAXN];
int v[MAXN];
int rmq[MAXLOG+1][MAXN];

int query( int left, int right ) {
  int len = logg[right-left+1];
  return min( rmq[len][left], rmq[len][right-(1 << len)] );
}

int main() {
  FILE *fin, *fout;
  int n, m, i, put, left, right;
  fin = fopen( "rmq.in", "r" );
  fscanf( fin, "%d%d", &n, &m );
  for( i = 2; i <= n; i++ )
    logg[i] = logg[i/2] + 1;
  for( i = 0; i < n; i++ )
    fscanf( fin, "%d", &v[i] );
  for( i = 0; i < n; i++ )
    rmq[0][i] = v[i];
  for( put = 1; put <= logg[n]; put++ ) {
    for( i = 0; i <= n - ( 1 << put ); i++ )
      rmq[put][i] = min( rmq[put-1][i], rmq[put-1][i+(1<<(put-1))] );
  }

  fout = fopen( "rmq.out", "w" );
  for( i = 0; i < m; i++ ) {
    fscanf( fin, "%d%d", &left, &right );
    fprintf( fout, "%d\n", query( left, right ) );
  }
  fclose( fout );
  return 0;
}