Cod sursa(job #3152001)

Utilizator vlad_dimuVlad Dimulescu vlad_dimu Data 23 septembrie 2023 14:38:00
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define LOGMAX 17
using namespace std;

ifstream fin( "rmq.in" );
ofstream fout( "rmq.out" );

int RMQ[LOGMAX][MAXN];
int p2[LOGMAX];
int lg2[MAXN + 1];

int v[MAXN];


int main(){
  int N, M, i, k, st, dr, sol;
  fin >> N >> M;

  for( i = 0; i < N; i++ )
    fin >> v[i], RMQ[0][i] = v[i];

  p2[0] = 1;
  for( i = 1; i < LOGMAX; i++ )
    p2[i] = 2 * p2[i - 1];

  lg2[1] = 0;
  for( i = 2; i <= MAXN; i++ )
    lg2[i] = lg2[i / 2] + 1;

  for( k = 1; k <= lg2[N]; k++ ){
    for( i = 0; i < N; i++ ){
      RMQ[k][i] = RMQ[k - 1][i];
      if( i + p2[k - 1] < N )
        RMQ[k][i] = min( RMQ[k - 1][i], RMQ[k - 1][i + p2[k - 1]] );
    }
  }

  for( i = 0; i < M; i++ ){
    fin >> st >> dr;
    st--, dr--;
    sol = min( RMQ[lg2[dr - st + 1]][st], RMQ[lg2[dr - st + 1]][dr - p2[lg2[dr - st + 1]] + 1] );
    fout << sol << '\n';
  }
  return 0;
}