Cod sursa(job #3146385)

Utilizator Ana_22Ana Petcu Ana_22 Data 20 august 2023 18:56:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <stdio.h>
#define NMAX 100000
#define MAXLOG 17

using namespace std;

int v[NMAX];
int table[NMAX][MAXLOG];
int logg[NMAX];

inline int f( int x, int y ) {
  return x < y ? x : y;
}

void calcLog( int n ) {
  int i;
  logg[1] = 0;
  for( i = 2; i <= n; i++ )
    logg[i] = logg[i/2] + 1;
}

void build( int n ) {
  int i, p;

  for( i = 0; i < n; i++ )
    table[i][0] = v[i];

  for( p = 1; p <= MAXLOG; p++ ) {
    for( i = 0; i + ( 1 << p ) - 1 < n; i++ )
      table[i][p] = f( table[i][p-1], table[i+(1<<(p-1))][p-1] );
  }

}

int query( int l, int r ) {
  int len = ( r - l + 1 );
  int log = logg[len];
  return f( table[l][log],
           table[r-(1<<log)+1][log] );
}

int main() {
    FILE *fin, *fout;
    int n, m, i, x, y;
    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", &v[i] );

    calcLog( n );
    build( n );

    for( i = 0; i < m; i++ ) {
      fscanf( fin, "%d%d", &x, &y );
      fprintf( fout, "%d\n", query( x - 1, y - 1 ) );
    }

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