Cod sursa(job #1046148)

Utilizator bghimisFMI Ghimis Bogdan bghimis Data 2 decembrie 2013 18:24:29
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>
#include <cmath>
using namespace std;

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

int n;
int v [100001];
int ma[100001][100];

void preprocess()
{
  for (int i = 0; i < n; ++i)
    ma[i][0] = i;

  for (int j = 1; (1 << j) <= n; ++j)
    for (int i = 0; i + (1 << j) - 1 < n; ++i)
      if (v[ma[i][j - 1]] < v[ma[i + (1 << (j - 1))][j - 1]])
	ma[i][j] = ma[i][j - 1];
      else
	ma[i][j] = ma[i + (1 << (j - 1))][j - 1];
}

int rmq(int x, int y)
{
  int lg = log2 (y - x + 1);

  if (v[ma[x][lg]] <= v[ma[y - (1 << lg) + 1][lg]])
    return ma[x][lg];
  else
    return ma[y - (1 << lg) + 1][lg];
}

int main()
{
  int m;
  in >> n >> m;
  
  for (int i = 0; i < n; ++i)
    in >> v[i];

  preprocess();

  for (int i = 0; i < m; ++i)
    {
      int x, y; 
      in >> x >> y;
      out << v[rmq(x - 1, y - 1)] << "\n";
    }

  return 0;
}