Cod sursa(job #409310)

Utilizator csizMocanu Calin csiz Data 3 martie 2010 16:15:29
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <iostream>

using namespace std;

int log2(int x) {
  int r = 0;
  while ((x >> r) != 0) {
    r++;
  }
  return r-1; // returns -1 for x==0, floor(log2(x)) otherwise
}

int main(){

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

    int n,m;in>>n>>m;

    vector<int> v(n);

    for(int i=0;i<n;i++){
        in>>v[i];
    }

    vector<vector<int> > precalc(n,vector<int>(log2(n)+1));
    for(int i=0;i<n;i++) precalc[i][0]=i;





    for(int j=1;(1<<j)<n;j++){
        for(int i=0;i-1+(1<<j)<n;i++){
            if(v[precalc[i][j-1]]<v[precalc[i+(1<<(j-1))][j-1]]){
                precalc[i][j]=precalc[i][j-1];
            }else{
                precalc[i][j]=precalc[i+(1<<(j-1))][j-1];
            }
        }
    }

    for(int i=0;i<m;i++){
        int a,b;in>>a>>b;a--;b--;
        int temp=log2(b-a+1);
        if(v[precalc[a][temp]]<v[precalc[b-(1<<temp)+1][temp]]){
            out<<v[precalc[a][temp]];
        }else{
            out<<v[precalc[b-(1<<temp)+1][temp]];
        }
        out<<"\n";
    }
}