Cod sursa(job #1939589)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 25 martie 2017 20:43:12
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int PRE[18][100005];
int LOG2[100005];
int n,m;

void read(){
    in>>n>>m;
    for(int i=1;i<=n;i++){
        in>>PRE[0][i];
    }
}
void logs(){
    for(int i=2;i<=n;i++){ //! trebe sa inceapa de la 2
        LOG2[i]=LOG2[i/2]+1;
    }
}
void preprocess(){
    logs();
    for(int i=1;(1<<i)<=n;i++){ //! 2^n <= n
        for(int j=1;j<=n;j++){
            PRE[i][j]=min(PRE[i-1][j], PRE[i-1][j+(1<<(i-1))]);
        }
    }
}
void query(){
    int low,hi,nr_elem, log_elem;
    for(int i=1;i<=m;i++){
        in>>low>>hi;
        nr_elem=hi-low+1;
        log_elem=LOG2[nr_elem];
        out<<min(PRE[log_elem][low],
                 PRE[log_elem][low+nr_elem-(1<<log_elem)])
                                //!  ^ se misca nr_elem-(1<<log_elem) in dreapta fata de low.
            <<"\n";
    }
}
int main(){
    read();
    preprocess();
    query();
    return 0;
}