Cod sursa(job #159467)

Utilizator FlorinC1996Florin C FlorinC1996 Data 14 martie 2008 10:18:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
 #include <stdio.h>   
#include <vector>   
  
using namespace std;   
  
#define NMAX 100002   
#define LMAX 18   
  
long int rmq[LMAX][NMAX];   
long int n,m;   
long int lg[NMAX];   
long int a[NMAX];   
  
int main()   
{   
    freopen("rmq.in","r",stdin);   
    freopen("rmq.out","w",stdout);   
  
    long int i,j,l;   
  
    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 <= n - (1 << i)+1;j++)   
        {   
        l=1<<(i-1);   
        rmq[i][j]= min( rmq[i-1][j] , rmq[i-1][j+l] );   
        }   
  
    long int x,y,diff,sh;   
       
    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;   
}