Cod sursa(job #2010597)

Utilizator AlexandruLuchianov1Alex Luchianov AlexandruLuchianov1 Data 13 august 2017 18:31:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");
int const nmax = 100000;
int n;
int v[1 + nmax];
int rmq[20][nmax];
int lg[1 + nmax];

void computermq(){
   for(int i = 1; i < n ;i++){
    if(v[i] < v[i + 1])
      rmq[0][i] = v[i];
    else
      rmq[0][i] = v[i + 1];
  }
  for(int i = 1 ; i <= 20 ;i++){
    int lim = n - (1 << i);
    for(int j = 1 ; j <= lim ;j++){
      if(rmq[i - 1][j] < rmq[i - 1][j + (1 << (i - 1) )])
        rmq[i][j] = rmq[i - 1][j];
      else
        rmq[i][j] = rmq[i - 1][j + (1 << (i - 1) )];
    }
  }
}
int main()
{
  int q;
  in>>n>>q;
  for(int i = 1 ; i <= n ;i++){
    in>>v[i];
    if(1 < i)
      lg[i] = lg[(i >> 1) ] + 1;
  }
  int x , y;
  computermq();
  for(int i = 0 ; i < q ;i++){
    in>>x>>y;
    if(x == y)
      out<<v[x]<<'\n';
    else {
      out<<min(rmq[lg[y - x]][x], rmq[lg[y - x]][y - (1 << lg[y - x ]) ] )<<'\n';
    }
  }
  return 0;
}