Cod sursa(job #2312929)

Utilizator DariusDCDarius Capolna DariusDC Data 5 ianuarie 2019 19:48:48
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100001

using namespace std;

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

const int MMAX = log2 (100001);

int n, m;
int input[NMAX];
int sparse[NMAX][MMAX];

void Construct()
{
  for (int i = 0; i < n; i++)
    sparse[i][0] = i;
  for (int j = 1; (1 << j) <= n; j++)
  {
    for (int i = 0; i + (1 << j) - 1 < n; i++)
    {
      if (input[sparse[i][j-1]] < input[sparse[i+(1 << j-1)][j-1]])
        sparse[i][j] = sparse[i][j-1];
      else
        sparse[i][j] = sparse[i+(1 << j-1)][j-1];
    }
  }
}

int Query(int low,int high)
{
  int l = high - low + 1;
  int k = log2(k);
  return min(input[sparse[low][k]] , input[sparse[low + l - (1 << k)][k]]);
}

int main()
{
  fin >> n >> m;
  for (int i = 0; i < n; i++)
    fin >> input[i];
  Construct();
  while (m--)
  {
    int a, b;
    fin >> a >> b;
    fout << Query(a-1,b-1) << "\n";
  }
  return 0;

}