Cod sursa(job #2174505)

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

int n,m,val[nmax],dp[nmax][lggmax],lgn,logs[nmax];

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

void precalclog()
{
    for (int i=2;i<=n;++i)
        logs[i]=logs[i>>1]+1;
    int npow=0;
    for (int i=1;i<=n;i<<=1,++npow);
    lgn=npow-1;
}

void precalc()
{
    for (int i=1;i<=n;++i)
        dp[i][0]=i;
    for (int j=1;j<=lgn;++j)
        for (int i=1;i+(1<<j)-1<=n;++i)
            if (val[dp[i][j-1]]<val[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 a,b;
    for( int i=1;i<=m;++i)
        {f>>a>>b;
        if (a>b)
            swap(a,b);
        int locallog=logs[b-a+1];
        g<<min(val[dp[a][locallog]],val[dp[b-(1<<locallog)+1][locallog]])<<'\n';
    }
}

int main()
{
    read();
    precalclog();
    precalc();
    query();
    return 0;
}