Cod sursa(job #1234884)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 28 septembrie 2014 11:41:11
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#define n_max 100020
#include <algorithm>
#define log2n_max 18

using namespace std;
int n,ml;
int a[n_max];
int m[log2n_max][n_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]);
       }
}

void solve(){
  int x,y;

  while(ml--){

     scanf("%d%d",&x,&y);
     l=lag[y-x+1];
     tv=y-x+1-(1<<l);
     printf("%ld\n",min(m[l][x],m[l][x+tv]));

  }

}

int main(void){
  freopen("rmq.in", "r",stdin);
  freopen("rmq.out","w",stdout);
  scanf("%d %d",&n,&ml);
  read(n);
  preprocess();
  lg();
  solve();
}