Cod sursa(job #998825)

Utilizator thewildnathNathan Wildenberg thewildnath Data 18 septembrie 2013 11:38:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include<stdio.h>

int v[100002],d[100002][20],d2[100002][20],Log[100002];

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n,m,i,j,sol,e,l,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    ///////////////

    for(i=1;i<=n;++i)
        d[i][0]=i;

    v[0]=2000000000;
    for(j=1;1<<j<=n;++j)
    {
        for(i=1;i+(1<<j)-1<=n;++i)
        {
            if(v[d[i][j-1]]<=v[d[i+(1<<(j-1))][j-1]])
                d[i][j]=d[i][j-1];
            else
                d[i][j]=d[i+(1<<(j-1))][j-1];
        }
    }

    //////////////////////


    ///////////////////
    e=0;
    l=1;
    for(i=1;i<=n;++i)
    {
        if(i>=l*2)
        {
            l*=2;
            ++e;
        }
        Log[i]=e;
    }

    ///////////////
    while(m--)
    {
        scanf("%d%d",&i,&j);
        sol=2000000000;
        k=Log[j-i+1];
        if(v[d[i][k]]<=v[d[j-(1<<k)+1][k]])
            sol=v[d[i][k]];
        else
            sol=v[d[j-(1<<k)+1][k]];



        printf("%d\n",sol);
    }
    return 0;
}
/*
#include<stdio.h>

int v[100002],d[1000002][20],d2[1000002][20],Log[100002];

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n,m,i,j,sol,sol2,e,l,k;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    ///////////////

    for(i=1;i<=n;++i)
        d[i][0]=i;

    v[0]=2000000000;
    for(j=1;1<<j<=n;++j)
    {
        for(i=1;i+(1<<j)-1<=n;++i)
        {
            if(v[d[i][j-1]]<=v[d[i+(1<<(j-1))][j-1]])
                d[i][j]=d[i][j-1];
            else
                d[i][j]=d[i+(1<<(j-1))][j-1];
        }
    }

    //////////////////////

    for(i=1;i<=n;++i)
        d2[i][0]=i;

    for(j=1;1<<j<=n;++j)
    {
        for(i=1;i+(1<<j)-1<=n;++i)
        {
            if(v[d2[i][j-1]]>=v[d2[i+(1<<(j-1))][j-1]])
                d2[i][j]=d2[i][j-1];
            else
                d2[i][j]=d2[i+(1<<(j-1))][j-1];
        }
    }

    ///////////////////
    e=0;
    l=1;
    for(i=1;i<=n;++i)
    {
        if(i>=l*2)
        {
            l*=2;
            ++e;
        }
        Log[i]=e;
    }

    ///////////////
    while(m--)
    {
        scanf("%d%d",&i,&j);
        sol=2000000000;
        k=Log[j-i+1];
        if(v[d[i][k]]<=v[d[j-(1<<k)+1][k]])
            sol=v[d[i][k]];
        else
            sol=v[d[j-(1<<k)+1][k]];

        if(v[d2[i][k]]>=v[d2[j-(1<<k)+1][k]])
            sol2=v[d2[i][k]];
        else
            sol2=v[d2[j-(1<<k)+1][k]];

        printf("%d\n",sol2-sol);
    }
    return 0;
}
*/