Cod sursa(job #921092)

Utilizator FayedStratulat Alexandru Fayed Data 20 martie 2013 19:29:40
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>
#include <cmath>
#define NMAX 100001

int V[NMAX],n,m;
int M[NMAX][20];
int lg[NMAX];

inline int RMQ(int i,int j){

    int k = lg[j-i+1];
    if(V[M[i][k]] < V[M[j-(1<<k)+1][k]])
        return V[M[i][k]];
        else return V[M[j-(1<<k)+1][k]];
}

int main(){

    int i,j;
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=n;++i)
        scanf("%d",&V[i]);

for(register int i=1;i<=n;++i)
    M[i][0] = i;

    for(register int j=1;(1<<j)<=n;++j)
        for(register int i=1;i+(1<<j)-1<=n;++i)
            if(V[M[i][j-1]] <= V[M[i+(1<<(j-1))][j-1]])
                M[i][j] = M[i][j-1];
            else
                M[i][j] =  M[i+(1<<(j-1))][j-1];
int p=1;
    for(register int i=1;i<=n;++i)
        if(p*2 == i) lg[i] = lg[i-1]+1, p*=2;
        else lg[i] = lg[i-1];

    while(m){

    scanf("%d%d",&i,&j);
       printf("%d\n",RMQ(i,j));

    --m;
    }
return 0;
}