Cod sursa(job #2174512)

Utilizator NannyiMaslinca Alecsandru Mihai Nannyi Data 16 martie 2018 12:22:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
using namespace std;
#define nmax 100005
ifstream f("rmq.in");
ofstream g("rmq.out");

int n,m,value[nmax],loga[nmax],logamx,dp[nmax][20];

void read()
{
    f>>n>>m;
    for (int i=1; i<=n; ++i)
        f>>value[i];
}

void logarithmms()
{
    for (int i=2; i<=n; ++i)
        loga[i]=loga[i>>1]+1;
    int power=0;
    for (int i=1; i<=n; i<<=1,++power);
    logamx=power-1;
}

void solve()
{
    for (int i=1;i<=n;++i)
        dp[i][0]=i;
    for (int j=1;j<=logamx;++j)
        for (int i=1;i+(1<<j)-1<=n;++i)
            if (value[dp[i][j-1]]<value[dp[i+(1<<(j-1))][j-1]])
                dp[i][j]=dp[i][j-1];
            else
                dp[i][j]=dp[i+(1<<(j-1))][j-1];
}

void query()
{
    int e1,e2;
    for (int i=1;i<=m;++i)
        {f>>e1>>e2;
        if (e1>e2)
            swap(e1,e2);
        int loggy=loga[e2-e1+1];
        g<<min(value[dp[e1][loggy]],value[dp[e2-(1<<loggy)+1][loggy]])<<'\n';
}}

int main()
{
    read();
    logarithmms();
    solve();
    query();
    return 0;
}