Cod sursa(job #2015400)

Utilizator GoogalAbabei Daniel Googal Data 26 august 2017 00:04:46
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

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

const int NMAX = 100000 + 100;
const int LOGMAX = 20;
const int INF = INT_MAX;

int n, m;
int dp[1 + NMAX][1 + LOGMAX];

int main()
{
  in >> n >> m;
  for(int i = 0; i <= NMAX; i++){
    for(int j = 0; j <= LOGMAX; j++){
      dp[i][j] = INF;
    }
  }

  for(int i = 1; i <= n; i++){
    in >> dp[i][0];
  }
  for(int j = 1; (1 << j) <= n; j++){
    for(int i = 1; i <= n; i++){
      dp[i][j] = min(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
    }
  }

  /*for(int i = 0; i <= n; i++){
    for(int j = 0; (1 << j) <= n; j++){
      out << dp[i][j] << ' ';
    }
    out << '\n';
  }*/

  for(int i = 1; i <= m; i++){
    int x, y, delta;
    in >> x >> y;
    delta = y - x;
    if(delta == 0){
      out << dp[x][0] << '\n';
    } else {
      int k = 0;
      for(k; (1 << k) <= delta; k++);
      k--;
      out << min(dp[x][k], dp[y - (1 << k) + 1][k]) << '\n';
    }
  }
  return 0;
}