Cod sursa(job #222948)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 26 noiembrie 2008 13:31:57
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
    #include <stdio.h>

long int min (long int a, long int b)
	{
	if (a<b) return a;
	else return b;
	}

   long int rmq[100][100];
   long int n,m;
   long int lg[100];
   long int a[100];
     
   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;  
   }