Cod sursa(job #161537)

Utilizator DorinOltean Dorin Dorin Data 18 martie 2008 14:29:57
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
# include <stdio.h> 
# include <cmath>

using namespace std;

# define input "rmq.in"
# define output "rmq.out"

# define max 1001
# define min(a,b) (a<b?a:b)

int x,y,i,j,n,m,a[max][65],k;

int main()
{
    freopen(input,"r", stdin);
    freopen(output, "w", stdout);
    
    scanf("%d%d",&n,&m);
    
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i][0]);
    }
    k=1;
    
    while(1<<k <= n) k++;
    k--;
    
    for(j=1;j<=k;j++)
        for(i=1;i<=n;i++)
        {
            a[i][j] = a[i][j-1];
            if( i + (1 << (j - 1)) <=n && a[i+ (1 << (j - 1))][j-1] < a[i][j])   a[i][j] = a[i+ (1 << (j - 1))][j-1];
        }
        
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        
        if(x == y)
           printf("%d\n",a[x][0]);
        
        int e=y-x;
        k = floor(log(e)/log(2));
        printf("%d\n",min(a[x][k],a[y-(1<<k)+1][k]));
    }
    
    return 0;
}