Cod sursa(job #1834158)

Utilizator Ionut228Ionut Calofir Ionut228 Data 23 decembrie 2016 23:37:34
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

const int INF = 0x3f3f3f3f;

int N, M;
int a, b, minim;
int V[100001], AINT[1 << 18];

void updateinit(int nod, int lt, int rt)
{
  if (lt == rt)
  {
    AINT[nod] = V[lt];
    return;
  }

  int mid = (lt + rt) / 2;

  updateinit(nod * 2, lt, mid);
  updateinit(nod * 2 + 1, mid + 1, rt);

  AINT[nod] = min(AINT[nod * 2], AINT[nod * 2 + 1]);
}

void query(int nod, int lt, int rt, int start, int finish)
{
  if (start <= lt && rt <= finish)
  {
    minim = min(minim, AINT[nod]);
    return;
  }
  if (lt == rt)
    return;

  int mid = (lt + rt) / 2;

  if (start <= mid)
    query(nod * 2, lt, mid, start, finish);
  if (mid < finish)
    query(nod * 2 + 1, mid + 1, rt, start, finish);
}

int main()
{
  fin >> N >> M;
  for (int i = 1; i <= N; ++i)
    fin >> V[i];

  updateinit(1, 1, N);
  for (int i = 1; i <= M; ++i)
  {
    fin >> a >> b;
    minim = INF;
    query(1, 1, N, a, b);

    fout << minim << '\n';
  }

  return 0;
}