Cod sursa(job #1960898)

Utilizator netfreeAndrei Muntean netfree Data 10 aprilie 2017 19:07:51
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <bits/stdc++.h>

using namespace std;

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

const int LOG_MAX = 100000+ 5;

int L[LOG_MAX];
int n , q;
int rmq[7][LOG_MAX];

void calc_log(){
    for(int i = 2; i<LOG_MAX; ++i)
        L[i] = 1 + L[i/2];
}


void calc_rmq(){

    for(int pd = 1; pd<=L[n]; ++pd){
        for(int i = 1; i<=(n-(1<<pd)+1); ++i)
            rmq[pd][i] = min (rmq[pd-1][i], rmq[pd-1][i+(int)pow(2,pd-1)]);
    }

}

int main(){

    calc_log();

    fin >> n >> q;

    int cn = n;
    for(int i = 1; i<=n; ++i){
        fin >> rmq[0][i];
    }

    calc_rmq();

//    for(int pd = 0; pd<=10; pd++){
//        for(int i = 1; i<=cn; ++i)
//            cout<<rmq[pd][i]<<" ";
//        cout<<"\n";
//    }

    while(q--){
        int a, b; fin >> a >> b;
        int bucata = L[b-a+1];
        fout<< min(rmq[bucata][a], rmq[bucata][b-(1<<bucata)+1] ) << "\n";
    }

    return 0;
}