Cod sursa(job #2199401)

Utilizator AndreiDumitrescuAndrei Dumitrescu AndreiDumitrescu Data 27 aprilie 2018 16:00:30
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#define infinit 999999999
using namespace std;

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

int v[100001], log[100001];
int dp[100001][22];
int n, m;

int minim(int a, int b)
{
  if(a < b)
    return a;
  return b;
}

int interogare(int x, int y)
{
  if(x == y)
    return v[x];
  else
  {
    int dif;
    dif = y - x + 1 ;
    return minim(dp[x][log[dif]], dp[y-1<<log[dif] + 1][y]);
  }
}

int main()
{
  f >> n;
  f >> m;
  int i, j, x , y;
  for(i = 0; i < n; i++)
    f >> v[i];
  for(i = 0; i < 100001; i++)
    for(j = 0; j < 16; j++)
      dp[i][j] = infinit;
  for(i = 0; i < n; i++)
    dp[i][0] = minim(v[i], v[i+1]);

  dp[n-1][0] = v[n-1];
  ///precalculare log
  j = 0;
  for(i = 1; i <= n; i++)
  {
    if(i >= 1 << j && i < 1 << (j+1))
      log[i] = j;
    else
    {
      j++;
      log[i] = j;
    }
  }
  for(j = 1; j < 16; j++)
  {
    for(i = 0;i < n; i++)
    {
      dp[i][j] = minim(dp[i][j-1], dp[i + 1 << (j-1)][j-1]);
    }
  }


  for(i = 0 ; i < m ; i++)
  {
    f >> x >> y;
    g << interogare(x-1, y-1) << '\n';
  }
}