Cod sursa(job #801500)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 24 octombrie 2012 15:50:32
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<cstdio>
#include<algorithm>

using namespace std;

int p,j,n,m,a[100002],rmq[100002][18],i,lg[100002],l;

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d ",&n,&m);
    for (i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    lg[1]=0;
    p=1;
    for (i=2;i<=n;i++)
    {
        if(i==p*2)
        {
            lg[i]=lg[i-1]+1;
            p=p*2;
        }
        else lg[i]=lg[i-1];
        //lg[i]=lg[i/2]+1;
    }
    for (i=1;i<=n;i++)
    {
        rmq[0][i]=a[i];
    }
    for (i=1;(1<<i)<=n;i++)
    {
        for (j=1;j<=n-(1<<i)+1;j++)
        {
            l=(1<<(i-1));
            rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+l]);
        }
    }
    int minus,shl,x,y;
    for (i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        minus=y-x+1;
        l=lg[minus];
        shl=minus-(1<<l);
        printf("%d\n",min(rmq[l][x],rmq[l][x+shl]));
    }
    return 0;
}