Cod sursa(job #1138606)

Utilizator cldmeClaudiu Ion cldme Data 10 martie 2014 12:19:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
int const N=100001;
int r[N][20],lg[N],v[N];

int min(int x,int y)
{
    if(x<y) return x;
    return y;
}

int q(int x,int y,int p2)
{
    return min(r[x+(1<<p2)-1][p2],r[y][p2]);
}

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