Cod sursa(job #573504)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 6 aprilie 2011 12:34:46
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>
#define Nmx 100005
#define Mmx 18
#define min(a,b) (a<b) ? a : b

using namespace std;

int R[Mmx][Nmx],m,n;
int A[Nmx],lg[Nmx];

void read()
{
    scanf("%d%d",&n,&m);
    lg[1]=0;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&A[i]);
        if(i==1) continue;
        lg[i]=lg[i/2]+1;
    }
}

void prepro()
{
    for(int i=1;i<=n;++i)
        R[0][i]=A[i];

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

void solve()
{
    int l,dif,x,y;
    for(;m;m--)
    {
        scanf("%d%d",&x,&y);
        dif=(y-x+1);
        l=lg[dif];
        printf("%d\n",min(R[l][x],R[l][x+(dif-(1<<l))]));
    }
}

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