Cod sursa(job #188703)

Utilizator GagosGagos Radu Vasile Gagos Data 9 mai 2008 18:16:21
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>
const long max=999999;    
long a[265150],st[265150],dr[265150],n,x,y,z,zero=1,fs,fd,tata;
long long m;      
long query(long p);      
int main()      
{      
    long i;      
    freopen("rmq.in","r",stdin);      
    freopen("rmq.out","w",stdout);      
    scanf("%ld %ld",&n,&m);      
    while(zero<n)      
        zero<<=1;
	for(i=zero;i<=zero<<1;++i)
		a[i]=max;
	zero--;      
    for(i=zero+1;i<=zero+n;++i){      
        st[i]=i-zero;      
        dr[i]=i-zero;      
        scanf("%ld",&a[i]);      
    }      
    for(i=n+1;i<=zero+1;++i){      
        st[zero+i]=i;      
        dr[zero+i]=i;      
    }      
    for(i=zero;i>=1;--i){      
        fs=i<<1;      
        fd=fs|1;      
        st[i]=st[fs];      
        dr[i]=dr[fd];      
        a[i]=(a[fs]<a[fd])?a[fs]:a[fd];      
    }      
    for(;m;m--){      
        scanf("%ld %ld",&y,&z);      
        printf("%ld\n",query(1));
	}      
    fcloseall();      
    return 0;      
}      
long query(long p)      
{      
    long m1,m2;      
    if(y>dr[p])      
        return max;      
    if(z<st[p])      
        return max;      
    if(y<=st[p] && z>=dr[p])      
        return a[p];      
    m1=query(p<<1);      
    m2=query((p<<1)|1);      
    m1=(m1<m2)?m1:m2;      
    return m1;      
}