Cod sursa(job #408756)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 3 martie 2010 10:51:39
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#define sizec 100010
#define sizel 20
#define min(a,b) a<b?a:b

using namespace std;

int rmq[sizel][sizec];
int n,m,put[sizec];

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


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

    for (int i=1;i<=put[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 x,y,d;
    for (int i=0;i<m;i++)
    {
        scanf ("%d %d",&x,&y);
        d=put[y-x+1];
        printf("%d\n",min(rmq[d][x], rmq[d][y-(1<<d)+1]));
    }
}

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