Cod sursa(job #1133682)

Utilizator Tudordmdaniel marin Tudordm Data 5 martie 2014 12:24:13
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>

int v[100001];
int p2[100001];
int rmq[18][100001];

int log(int n){

    p2[1] = 0;
	for(int i = 2; i <= n; ++i)
		p2[i] = p2[i >> 1] + 1;

}

int minim(int a,int b){

    if(a<=b)    return a;
    return b;

}

int main(){

    int a,b,i,j,log,n,m;

    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]);
        rmq[0][i]=v[i];

    }

    for(i=1;(1<<i)<=n;i++){
        for(j=1;j<=n-(1<<i)+1;j++){
            rmq[i][j]=minim(rmq[i-1][j],rmq[i-1][(j+(1<<(i-1)))]);
        }
    }

    for(i=1;i<=m;i++){

        scanf("%d%d",&a,&b);
        log=p2[b-a+1];
        printf("%d\n",minim(rmq[log][a], rmq[log][b-(1<<log)+1]));

    }

    return 0;
}