Cod sursa(job #1133686)

Utilizator Tudordmdaniel marin Tudordm Data 5 martie 2014 12:36:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include<stdio.h>

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

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);

    p2[1]=0;

    for(i=2;i<=n;i++){

        p2[i]=p2[i/2]+1;

    }

    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;
}