Cod sursa(job #2115171)

Utilizator netfreeAndrei Muntean netfree Data 26 ianuarie 2018 13:48:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 100000 + 5;

int lo, hi, n, m, dp[30][N_MAX], a[N_MAX];

void init(){
  for(int i =  1; i<=n; ++i)
    dp[0][i] = i;
  for(int power = 1; (1<<power) <= n; ++power)
    for(int i = 1; i + (1<<power) - 1 <= n; ++i)
      if(a[dp[power-1][i]] < a[dp[power-1][i + (1 << (power-1) ) ]])
        dp[power][i] = dp[power-1][i];
      else
        dp[power][i] = dp[power-1][i + (1 << (power-1))];
}

int query(int lo, int hi){
  int power = log2(hi-lo+1);
  if(a[dp[power][lo]] < a[dp[power][hi - (1 << power) + 1]])
    return dp[power][lo];
  return dp[power][hi - (1 << power) + 1];
}

int main(){
  fin >> n >> m;
  for(int i = 1; i<=n; ++i)
    fin >> a[i];
  init();
  while(m--){
    fin >> lo >> hi;
    fout << a[query(lo, hi)] << "\n";
  }
	return 0;
}

//Andrei Muntean, 2018