Cod sursa(job #164481)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 24 martie 2008 12:11:45
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
//Range minimum query
#include <cstdio>
#define min(a,b) (a<b?a:b)
const int nmax=100001;
const int lmax=16;
int a[nmax];
int log[nmax]; //log[x]=[log2(x)]  (parte intreaga din logaritm in baza 2 din x :D
int m[lmax][nmax];//m[i][j]=min(a[j],a[j+1],..a[j+2^i-1]
int n,i,j,k,t;
int main(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    scanf("%d %d",&n,&t);
    for (i=1;i<=n;i++) scanf("%d",&a[i]);
    log[1]=0;
    for (i=2;i<=n;i++) log[i]=log[i/2]+1;
    for (i=1;i<=n;i++) m[0][i]=a[i];
    for(i=1;(1<<i)<=n;i++)
      for (j=1;j<=n-(1<<i)+1;j++)
        m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
    while (t--){
          scanf("%d %d",&i,&j);
          k=log[j-i+1];
          printf("%d\n",min(m[k][i],m[k][j-(1<<k)+1]));
          }
    return 0;
}