Cod sursa(job #2193169)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 9 aprilie 2018 08:41:24
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>

using namespace std;

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

const int N=100000;
const int LgMax=17;
int n,v[N+5];
int log_2[N+5];
int rmq[N+5][LgMax+5];

void build_rmq()
{
    for(int i=1;(1<<i)<=n;i++)
        log_2[(1<<i)]=1;
    for(int i=1;i<=n;i++)
        log_2[i]+=log_2[i-1];
    for(int i=1;i<=n;i++)
        rmq[i][0]=v[i];
    for(int k=1;(1<<k)<=n;k++)
        for(int i=1;i+(1<<k)-1<=n;i++)
            rmq[i][k]=min(rmq[i][k-1],rmq[i+(1<<(k-1))][k-1]);
}
int min_val(int st,int dr)
{
    int l=dr-st+1,k;
    k=log_2[l];
    return min(rmq[st][k],rmq[dr-(1<<k)+1][k]);
}
int m;
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    build_rmq();
    for(int i=1;i<=m;i++)
    {
        int a,b;
        fin>>a>>b;
        fout<<min_val(a,b)<<"\n";
    }
    return 0;
}
/**
**/