Cod sursa(job #422671)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 23 martie 2010 00:44:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<iostream>
#include<string>

using namespace std;

#define KM 18
#define NM 100005

int RMQ[NM][KM],A[NM],LG[NM],N,M;

int main()
{
    int p2[KM],a,b;
    
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    for(int i=1;i<=N;++i)
       scanf("%d",&A[i]);
    
    p2[0]=1;
    
    for(int i=1;i<KM;++i)
       p2[i]=p2[i-1]*2;
    
    for(int i=1;i<=N;++i)
       RMQ[i][0]=A[i];
    
    for(int j=1;j<KM;++j)
       for(int i=1;;++i)
       {
           if(i+p2[j]-1>N) break;
           
           RMQ[i][j]=min(RMQ[i][j-1],RMQ[i+p2[j-1]][j-1]);    
       }   
    
    int ind=1,pt=0;
    
    while(ind<=N)
    {
        int depus=p2[pt];         
                 
        while(ind<=N && depus)
        {
            LG[ind]=pt;
            ++ind;         
            --depus;         
        }         
        
        ++pt;
    }
    
    while(M--)
    {
         scanf("%d %d",&a,&b);
         
         int lg=b-a+1;
         pt=LG[lg];
         
         int ans=min(RMQ[a][pt],RMQ[b-p2[pt]+1][pt]);
         
         printf("%d\n",ans);     
    }
    
    return 0;
}