Cod sursa(job #920976)

Utilizator FayedStratulat Alexandru Fayed Data 20 martie 2013 18:28:39
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <cmath>
#define NMAX 100001
#define LOGMAX (int)log(NMAX)

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

inline int RMQ(int i,int j){

    int k = log(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=0;i<n;++i)
        scanf("%d",&V[i]);

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

    for(register int j=1;(1<<j)<=n;++j)
        for(register int i=0;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];

    while(m){

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

    --m;
    }
return 0;
}