Cod sursa(job #1234878)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 28 septembrie 2014 11:31:39
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#define n_max 100020
#include <algorithm>
#define mv 1000000
#define log2n_max 17
#include <cmath>

using namespace std;
int n,ml;
int a[n_max],mxm;
int m[n_max][log2n_max];
long int l,tv;
//long int lag[n_max];

void read(int n){
  int i=1;
  while(i<=n)
    scanf("%d",&a[i++]);
}
/*
void lg(){
  lag[1]=0;
  for(int i=2;i<=n;i++)
     lag[i]=lag[i/2]+1;
}
*/
void preprocess(){
  int i,j;
  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++){
          l=(1<<(i-1));
          m[i][j]=min(m[i-1][j],m[i-1][j+l]);
       }
}


int main(void){
  freopen("rmq.in", "r",stdin);
  freopen("rmq.out","w",stdout);
  scanf("%d %d",&n,&ml);
  read(n);
  preprocess();
  //lg();
  int x,y;
  while(ml--){
     scanf("%d%d",&x,&y);
     l=log2(y-x+1);
     //l=lag[y-x+1];
     tv=y-x+1-(1<<l);
     printf("%ld\n",min(m[l][x],m[l][x+tv]));
  }
}