Cod sursa(job #161477)

Utilizator tm_raduToma Radu tm_radu Data 18 martie 2008 11:29:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>  

using namespace std;  

long int rmq[18][100002];  
long int n, m;  
long int lg[100002];  
long int a[100002];  
long int i, j, l;
long int x, y, diff, sh;  

long int min(long int a, long int b) { return a < b ? a : b; }

int main()  
{
    freopen("rmq.in", "r", stdin);  
    freopen("rmq.out", "w", stdout);  
    
    scanf("%ld %ld", &n, &m);
    for ( i = 1; i <= n; i++ )
        scanf("%ld ", &a[i]);  
    
    lg[1] = 0;  
    for ( i = 2; i <= n; i++ )
        lg[i]=lg[i/2]+1;  
    for ( i = 1; i <= n; i++)  
        rmq[0][i] = a[i];  
    for ( i = 1; (1 << i) <= n; i++ )
        for ( j = 1; j + (1<<i) - 1 <= n; j++ )
        {
            l = 1<<(i-1);
            rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+l]);  
        }
    for ( i = 1; i <= m; i++ )
    {
        scanf("%ld %ld", &x, &y);
        diff = y-x+1;  
        l = lg[diff];  
        sh = diff - (1<<l);  
        printf("%ld\n", min(rmq[l][x], rmq[l][x+sh]));  
    }
    return 0;  
}