Cod sursa(job #387026)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 26 ianuarie 2010 18:08:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include<stdio.h>
#define minim(a, b) (a<b ? a : b)
int n,m,v[100004];
int a[20][100004];
int p[100004];
int main ()
{
    int i,j,st,dr,k;
    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++)
        a[0][i]=v[i];
    for (k=1;(1<<k)<=n;k++)
        for(i=1;i<=n-(1<<k)+1;i++)
            a[k][i]=minim(a[k-1][i],a[k-1][i+(1<<(k-1))]);
    for (i=1;i<=n;i++)
    {
        for (k=0;(1<<k)<=i;k++);
        p[i]=k-1;
    }
    
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&st,&dr);
        k=p[dr-st+1];
        printf("%d\n",minim(a[k][st],a[k][dr-(1<<k)+1]));
    }
    return 0;
}