Cod sursa(job #1846358)

Utilizator saba_alexSabadus Alex saba_alex Data 12 ianuarie 2017 16:28:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <iostream>
#include <fstream>
#define MAX 100005

using namespace std;

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

int n,log[MAX],v[MAX],rmq[20][MAX],m,a,b;

void build(){
    for(int i=1;i<=n;++i)
        rmq[0][i]=v[i];
    for(int k=1;k<=log[n];++k)
        for(int i=1;i+(1<<k)-1<=n;++i)
            rmq[k][i]=min(rmq[k-1][i],rmq[k-1][i+(1<<(k-1))]);
}

int query(int a, int b){
    int l=log[b-a+1];
    return min(rmq[l][a],rmq[l][b-(1<<l)+1]);
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
        fin>>v[i];
    log[0]=-1;
    for(int i=1;i<=n;++i)
        log[i]=1+log[i/2];
    build();
    for(int i=1;i<=m;++i){
        fin>>a>>b;
        fout<<query(a,b)<<'\n';
    }
    return 0;
}