Cod sursa(job #717928)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 20 martie 2012 12:30:16
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#include<assert.h>

#include<vector>
#include<algorithm>

using namespace std;

const int knmax = 100005;
int numbers, qrys, pows[knmax], rmq[20][knmax];

void read(){
  assert(freopen("rmq.in", "r", stdin) != NULL);

  scanf("%d%d", &numbers, &qrys);

  for(int i = 1; i <= numbers; ++i)
    scanf("%d", &rmq[0][i]);
}

void solve(){
  int i, j;
  for(j = 1; j <= 18; ++j)
    for(i = 1; i <= numbers; ++i)
      if(i + (1 << (j - 1)) > numbers)
        rmq[j][i] = rmq[j - 1][i];
      else
        rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);

  for(i = 1, j = 0; i <= numbers; ++i){
    if(i == 1 << (j + 1))
      ++j;
    pows[i] = j;
  }
}

inline int query(int left, int right){
  int len = right - left + 1;
  return min(rmq[pows[len]][left], rmq[pows[len]][right - (1 << pows[len]) + 1]);
}

void write(){
  assert(freopen("rmq.out", "w", stdout) != NULL);

  int i, aux_x, aux_y;
  for(i = 1; i <= qrys; ++i){
    scanf("%d%d", &aux_x, &aux_y);
    printf("%d\n",query(aux_x, aux_y));
  }
}

int main(){
  read();
  solve();
  write();
  return 0;
}