Cod sursa(job #183504)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 22 aprilie 2008 12:01:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#define min(a,b) ((a<b)?a:b)

long n,Q,i,j,a[100005],m[18][100005];
long x,y,l,lg[100005];

long rmq(long x,long y){
     return min( m[ lg[y-x+1] ] [x],
                 m[ lg[y-x+1] ] [y-(1<<(lg[y-x+1]))+1] );
}

int main(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    
    scanf("%ld %ld",&n,&Q);
    for (i=1;i<=n;i++)
        scanf("%ld\n",&a[i]);
    //preprocesare
    for (i=1;i<=n;++i)
        m[0][i]=a[i];      //initializare pt 2^0
    for (i=2;i<=n;++i)
       lg[i]=lg[i>>1]+1;   //vector de logaritmi
    l=0;
    while ((long)(1<<l+1)<=n)l++; //cea mai mare putere a lui 2 mai mica decat n
    
    for (j=n;j;j--)
        for (i=1 ; i<=l && j+(1<<i)<=n+1 ; i++)
            m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
    
    //query
    for (i=1;i<=Q;i++){
        scanf("%ld %ld\n",&x,&y);
        printf("%ld\n",rmq(x,y));
    }

return 0;
}