Cod sursa(job #200925)

Utilizator mika17Mihai Alex Ionescu mika17 Data 27 iulie 2008 15:34:18
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include <cstdio>
#include <cstring>
#include <cmath>
#define min(a,b) a<b?a:b

int N,M,RMQ[17][100001]; // log(2,100000) ~= 16

int main()
{
 freopen("rmq.in","r",stdin);
 freopen("rmq.out","w",stdout);
 scanf("%d %d",&N,&M);
 memset(RMQ,127,sizeof RMQ);
 for(int i=1;i<=N;++i)
        scanf("%d",&RMQ[0][i]);
 for(int k=1;(1<<k)<=N;++k)
        for(int i=1;i<=N;++i)
         if(i+(1<<(k-1))<=N)
           RMQ[k][i] = min(RMQ[k-1][i],RMQ[k-1][i+(1<<(k-1))]);
          else RMQ[k][i] = RMQ[k-1][i];
 for(int p1,p2,i=0;i<M;++i)
 {
        scanf("%d %d",&p1,&p2);
        int log2L = int(log(p2-p1+1)/log(2));
        printf("%d\n",min(RMQ[log2L][p1],RMQ[log2L][p2+1-(1<<log2L)]));
 }
 return 0;
}