Cod sursa(job #407424)

Utilizator hasegandaniHasegan Daniel hasegandani Data 2 martie 2010 12:32:25
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>

#define log 20
#define Nmax 100005

int N,M;
int RMQ[log][Nmax];
int lg[Nmax];

int min(int a,int b)
{
    return (a<b?a:b);
}

void rmq()
{
    for(int i=2;i<=N;++i)
        lg[i]=lg[i>>1]+1;

    for(int i=1;(1<<i)<=N;++i)
        for(int j=1,p=(1<<(i-1)); j+(1<<i)-1<=N;++j)
            RMQ[i][j]=min(RMQ[i-1][j],RMQ[i-1][j+p]);
}

int rez(int A,int B)
{
    int dist,k,Sol;
    dist=B-A+1;
    k=lg[dist];
    Sol=min(RMQ[k][A],RMQ[k][B-(1<<k)+1]);
    return Sol;
}

void solve()
{
    rmq();

    int a,b;
    for(int i=1;i<=M;++i)
        {
        scanf("%d %d",&a,&b);
        printf("%d\n",rez(a,b));
        }
}

void cit();

int main()
{
    cit();
    solve();
    return 0;
}

void cit()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;++i)
        scanf("%d",&RMQ[0][i]);
}