Cod sursa(job #1302116)

Utilizator danalex97Dan H Alexandru danalex97 Data 26 decembrie 2014 17:13:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>
using namespace std;

ifstream F("rmq.in");
ofstream G("rmq.out");

const int N = 100010;

int n,m,a[N],rmq[20][N],lg[N];

int good(int x,int y)
{
    if ( a[x] < a[y] )
        return x;
    return y;
}

int ask(int x,int y)
{
    int wh = lg[y-x+1];
    return good(rmq[wh][x],rmq[wh][y-(1<<wh)+1]);
}

void build()
{
    for (int i=1;(1<<i)<=n;++i)
        lg[(1<<i)]++;
    for (int i=1;i<=n;++i)
        lg[i] += lg[i-1];
    for (int i=1;i<=n;++i)
        rmq[0][i] = i;
    for (int i=1;(1<<i)<=n;++i)
        for (int j=1;j<=n;++j)
            rmq[i][j] = j + (1<<i)/2 <= n ? good(rmq[i-1][j],rmq[i-1][j+(1<<i)/2]) : rmq[i-1][j];
}

int main()
{
    F>>n>>m;
    for (int i=1;i<=n;++i)
        F>>a[i];
    build();

    for (int i=1,x,y;i<=m;++i)
    {
        F>>x>>y;
        G<<a[ask(x,y)]<<'\n';
    }
}