Cod sursa(job #2118517)

Utilizator DawlauAndrei Blahovici Dawlau Data 30 ianuarie 2018 18:41:18
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100005, LOG2NMAX = log2(NMAX);

int rmq[LOG2NMAX][NMAX], numbersCount, queriesCount;

inline void read_data(){

    fin >> numbersCount >> queriesCount;

    int index;
    for(index = 1; index <= numbersCount; ++index)
        fin >> rmq[0][index];
}

inline void createRMQ(){

    int row, column;

    for(row = 1; (1 << row) <= numbersCount; ++row)
        for(column = 1; column <= numbersCount - (1 << row) + 1; ++column)
            rmq[row][column] = min(rmq[row - 1][column], rmq[row - 1][column + (1 << (row - 1))]);
}

inline void printRMQ(){

    int row, column;

     for(row = 0; (1 << row) <= numbersCount; ++row){
        for(column = 1; column <= numbersCount - (1 << row) + 1; ++column)
            fout << rmq[row][column] << ' ';
        fout << '\n';
     }
}

inline void answerQueries(){

    int sequenceLength, levelInRMQ, leftIndex, rightIndex;

    while(queriesCount--){

        fin >> leftIndex >> rightIndex;

        sequenceLength = rightIndex - leftIndex + 1;
        levelInRMQ = (int)log2(sequenceLength);

        fout << min(rmq[levelInRMQ][leftIndex], rmq[levelInRMQ][leftIndex + sequenceLength - (1 << levelInRMQ)]) << '\n';
    }
}

int main(){

    read_data();
    createRMQ();
    answerQueries();
}