Cod sursa(job #1966902)

Utilizator RaZxKiDDavid Razvan RaZxKiD Data 15 aprilie 2017 17:36:17
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int LOG2[100005];
int RMQ[20][100005];
int n,qs;

void read(){
    in>>n>>qs;
    for(int i=1;i<=n;i++){
        in>>RMQ[0][i];
    }
}
void logs(){
    for(int i=2;i<=n;i++){
        LOG2[i]=LOG2[i>>1]+1;
    }
}
void prep(){
    logs();
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j<=n;j++){
            RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+(1<<(i-1))]);
        }
    }
}
void queries(){
    for(int x,y,i=1;i<=qs;i++){
        in>>x>>y;
        int lo=min(x,y);
        int hi=max(x,y);
        int nr_elem=hi-lo+1;
        int log=LOG2[nr_elem];
        out<<min(RMQ[log][lo],RMQ[log][lo+nr_elem-(1<<log)]);
    }
}
int main(){
    read();
    prep();
    queries();
    return 0;
}