Cod sursa(job #573482)

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

using namespace std;

int R[Nmx][Mmx],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[i][0]=A[i];

    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i<=n-(1<<i)+1;++i)
            R[i][j]=min(R[i][j-1],R[i+(1<<(j-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[x][l],R[x+(dif-(1<<l))][l]));
    }
}

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