Cod sursa(job #411939)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 5 martie 2010 11:33:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>

using namespace std;

const int size = 100010;

int rmq[20][size],n,m;
int dif[size];

void citire()
{
    scanf ("%d %d",&n,&m);
    for (int i=1;i<=n;i++)
        scanf ("%d",&rmq[0][i]);
}

inline int min(int a,int b)
{
    return a<b?a:b;
}

void rmq_solve()
{
    for (int i=2;i<=n;i++)
        dif[i] = dif[i>>1]+1;

    for (int i=1;i<=dif[n];i++)
        for (int j=1; j<= n-(1<<i)+1; j++)
            rmq[i][j]=min(rmq[i-1][j] , rmq[i-1][j+(1<<(i-1))]);
}

void afish()
{
    int a,b,d;
    for (int i=0;i<m;i++)
    {
        scanf ("%d %d",&a,&b);
        d=dif[b-a+1];
        printf("%d\n",min(rmq[d][a] ,rmq[d][b-(1<<d)+1]));
    }
}

int main()
{
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    citire();
    rmq_solve();
    afish();
    return 0;
}