Cod sursa(job #409327)

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

using namespace std;

struct tabel{
    vector<int> log;
    tabel(int n){
        log=vector<int>(n+1,0);
        for(int i=2;i<=n;i++) log[i]=log[i/2]+1;
    }
    int operator()(int x){
        return log[x];
    }
};





int main(){

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

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

    vector<int> v(n);tabel log2(n);

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

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





    for(int j=1;(1<<j)<n;j++){
        for(int i=0;i-1+(1<<j)<n;i++){
            if(v[precalc[j-1][i]]<v[precalc[j-1][i+(1<<(j-1))]]){
                precalc[j][i]=precalc[j-1][i];
            }else{
                precalc[j][i]=precalc[j-1][i+(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[temp][a]]<v[precalc[temp][b-(1<<temp)+1]]){
            out<<v[precalc[temp][a]];
        }else{
            out<<v[precalc[temp][b-(1<<temp)+1]];
        }
        out<<"\n";
    }
}