Cod sursa(job #164567)

Utilizator MciprianMMciprianM MciprianM Data 24 martie 2008 15:32:41
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<fstream>
#define MAXN           100000
#define LOGMAXN        17
using namespace std;
int M[LOGMAXN][MAXN], a[MAXN];
int log[MAXN+1], n, m;
void create(){
  int i;
  log[0]=-1;
  log[1]=0;
  for(i=2;i<=n;i++)
    log[i]=log[(i>>1)]+1;
}
void build(){
  int i,j;
  for(i=0;i<n;i++)
    M[0][i]=i;
  for(i=1;(1<<i)<n;i++)
    for(j=0;j<n-(1<<i)+1;j++)
      if(a[M[i-1][j]]<a[M[i-1][j+(1<<(i-1))]]) M[i][j]=M[i-1][j];
      else M[i][j]=M[i-1][j+(1<<(i-1))];

}
int query(int i, int j){
  if(a[M[log[j-i+1]][i]]<a[M[log[j-i+1]][j-(1<<log[j-i+1])+1]]) return M[log[j-i+1]][i];
  else return M[log[j-i+1]][j-(1<<log[j-i+1])+1];
}
int main(){
  int i, x, y;
  ifstream f("rmq.in");
  f>>n>>m;
  for(i=0;i<n;i++)
    f>>a[i];
  create();
  build();
  ofstream g("rmq.out");
  for(i=0;i<m;i++){
    f>>x>>y;
    x--;y--;
    g<<a[query(x,y)]<<'\n';
  }
  f.close();
  g.close();
  return 0;
}