Cod sursa(job #235727)

Utilizator crawlerPuni Andrei Paul crawler Data 25 decembrie 2008 15:47:53
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>

#define Nmax 100100

int t[Nmax][17],n,m;

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

#define DIM 10000
char buf[DIM];
int pozi;
int NR;
#define buff fread(buf,1,DIM,stdin),pozi=0

#define cit \
{\
    NR=0;\
    while (buf[pozi] < '0') if (++pozi == DIM) buff;\
    while (buf[pozi] >='0')\
    {\
              NR = NR*10 + buf[pozi] - '0';\
          if (++pozi == DIM) buff;      \
    }\
}
#define read(X) {cit X = NR;}

int main()
{
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    
    buff;
    read(n) read(m)
    
    for (int i=1;i<=n;++i)
    read(t[i][0])
    
    for (int j=1;(1<<j)<=n;++j)
    for (int i=1;i<=n;++i) if (i+(1<<(j-1))<=n) t[i][j] = min(t[i][j-1],t[i+(1<<(j-1))][j-1]);
    
    int x,y;
    
    for (int i=1;i<=m;++i)
    {
        read(x) read(y)
        int ret=123456789;   
        for (int k=16;k>=0;--k) if(x+(1<<k)-1<=y)
        {
            ret = min(ret,t[x][k]);
            x += (1<<k);    
        }
        printf("%d\n", ret);        
    }


    
    return 0;
}