Cod sursa(job #433825)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 4 aprilie 2010 14:38:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <stdio.h>
#include <algorithm>
#define IN "rmq.in"
#define OUT "rmq.out"
#define L 100005
#define I 18

using namespace std;

int rmq[I][L];
int n, m;
int put[L];

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

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

    for (int i=1;i<=put[n];i++)
    {
        R=(1<<i)-1;
        R1=(1<<(i-1));
        for (int j=1;j<=n-R;j++)
            rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+R1]);
    }
}

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

int main ()
{
    freopen (IN ,"r", stdin);
    freopen (OUT ,"w", stdout);
    citire();
    solve();
    afisare();
    return 0;
}