Cod sursa(job #2393798)

Utilizator sergiudnyTritean Sergiu sergiudny Data 1 aprilie 2019 08:35:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>
#define DM 100005
#define logN 17
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int rmq[DM][logN],v[DM],n,m,a,b;

void construct(){
    for(int i=1;i<=n;++i) rmq[i][0]=i;

    for(int j=1;(1<<j)<=n;++j) for(int i=1;i<=n;++i){
        if(i+(1<<(j-1)) <= n){
            if(v[ rmq[i][j-1] ] < v[ rmq[i+(1<<(j-1))][j-1] ]) rmq[i][j]=rmq[i][j-1];
            else rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
        } else {
            rmq[i][j]=rmq[i-1][j];
        }

    }
}

void getAns(){
    int logDist = log2(b-a+1);
    int x1 = rmq[a][logDist];
    int x2 = rmq[b-(1<<logDist)+1][logDist];
    fout<<min(v[x1],v[x2])<<'\n';
}

int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;++i)
        fin>>v[i];
    construct();

    while(m--){
        fin>>a>>b;
        getAns();
    }
    return 0;
}