Cod sursa(job #373717)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 14 decembrie 2009 21:30:01
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<iostream>
#include<string>

using namespace std;

#define NM 100005
#define PM 17
#define FOR(i,a,b)for(int i=(a);i<=(b);++i)

int A[NM],RMQ[NM][PM],L[NM],N,M;

int main()
{
    int a,b;
    
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    
    scanf("%d %d",&N,&M);
    
    FOR(i,1,N)
      scanf("%d",&A[i]);
    
    int cat=0,poz=1;
    
    while(poz<N)
    {
      int end=poz+(1<<cat)-1;
      
      while(poz<=N && poz<=end)
      {
        L[poz]=cat;
        ++poz;
      }
      
      ++cat;
    }
    
    /*
    FOR(i,1,N)
      printf("%d ",L[i]);
    */
    
    FOR(i,1,N)
      RMQ[i][0]=A[i];
    
    FOR(l,1,16)
      FOR(i,1,N)
      {
        if(i+(1<<l)-1>N) break;
        
        RMQ[i][l]=min(RMQ[i][l-1],RMQ[i+(1<<(l-1))][l-1]);
      }
      
    FOR(i,1,M)
    {
      scanf("%d %d",&a,&b);
      
      int l=L[b-a+1];
      
      int ans=min(RMQ[a][l],RMQ[b-(1<<l)+1][l]);
      
      printf("%d\n",ans);
    }  
    
    return 0;
}