Cod sursa(job #2396646)

Utilizator stoicaandreiStoica Marius-Andrei stoicaandrei Data 3 aprilie 2019 18:14:44
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define lgmax 17
#define nmax 100005

using namespace std;

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

int n, m, lg[nmax];
int v[lgmax][nmax];

void rmq()
{ 
  int i;
  lg[1] = 0;
  for (i = 2; i<= n; i++)
    lg[i] = lg[i/2] + 1;

  //(2 ^ lg [i])  <= i && 
  // i < (2 ^ (lg[i]+ 1) 

  for (int i = 1; (1 << i) <= n; i ++)
  {
    int l = 1 << (i - 1);
    for (int j = 1; j <= n - (1 << i) + 1; j ++)
      v[i][j] = min(v[i-1][j], v[i-1][j+l]);
    //v[i][j] = j -> j + l * 2 - 1;
    //v[i-1][j] = j -> j + l - 1;
    //v[i-1][j+l] = j + l, j + l * 2 -1;
  }
}

int main() {
  
  fin >> n >> m;

  for (int i = 1; i <= n; i ++)
    fin >> v[0][i];

  rmq();

  for (int i = 1; i<= m; i++) 
  { 
      // 7 20, l = 14;
      // p = 8;
      // min(7, 7 + 2^3 - 1), V[3][7], 
      // min(20 - 2^3 + 1, 20), v[3][20-p+1]
      int x, y;
      fin >> x >> y;

      int lg_val = lg[y-x+1];
      fout << min(v[lg_val][x], v[lg_val][y - (1<<lg_val) + 1]) << "\n";
  }
  

}