Cod sursa(job #2499986)

Utilizator CezarHutanuCezar Hutanu CezarHutanu Data 27 noiembrie 2019 08:13:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.87 kb
#include <fstream>

using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
const int nmax=100007;
int v[nmax],rmq[nmax][20];
int query(int a,int b)
{
    int pas;
    for(pas=0;(1<<pas)<=b-a+1;pas++);
    pas--;
    if(v[rmq[a][pas]]<=v[rmq[b-(1<<pas)+1][pas]])
        return rmq[a][pas];
    else return rmq[b-(1<<pas)+1][pas];
}
int main()
{
    int n,m;
    fin>>n>>m;
    int i;
    for(i=1;i<=n;i++)
    {
        fin>>v[i];
        rmq[i][0]=i;
    }
    int j;
    for(j=1;(1<<j)<=n;j++)
    {
        for(i=1;i+(1<<j)-1<=n;i++)
        {
           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];
        }
    }
    int a,b;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b;
        fout<<v[query(a,b)]<<'\n';
    }
    return 0;
}