Cod sursa(job #161544)

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

using namespace std;

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

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

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

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=0;
    
     for ( i = 2; i <= n; i++ )  
         lg[i]=lg[i/2]+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]);
           continue;
        }
        
        k = lg[y-x];
        
        printf("%d\n",min(a[x][k],a[y-(1<<k)+1][k]));
    }
    
    return 0;
}