Cod sursa(job #154364)

Utilizator moga_florianFlorian MOGA moga_florian Data 11 martie 2008 09:56:05
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#define Nmax 100010

int arb[3*Nmax];
int poz[Nmax];

int MIN(int x,int y){
  if(x<y)
    return x;
  return y;
}

int go(int i,int li,int lf,int a, int b){
 
  if(lf<a || b<li)
    return 10000000;
    
  if(a<=li && lf<=b)
    return arb[i];
    
  int mij = (li+lf)>>1;
  return MIN(go(2*i,li,mij,a,b), go(2*i+1,mij+1,lf,a,b));
  
}

void init(int i,int li, int lf){
  
  arb[i] = 10000000;
  
  if(li==lf){
    poz[li] = i;
    return; 
  }
  
  int mij = (li+lf)>>1;
  init(2*i,li,mij);
  init(2*i+1,mij+1,lf);
  
}

int main(){

  FILE *fin = fopen("rmq.in","r"),
       *fout = fopen("rmq.out","w");
       
  int N,M;
  fscanf(fin,"%d%d",&N,&M);

  init(1,1,N);
  
  for(int i=1;i<=N;i++){
    fscanf(fin,"%d",&arb[poz[i]]);
    
    int j=poz[i]/2;
    while(j){
      arb[j] = arb[2*j];
      if(arb[2*j+1] < arb[j])
        arb[j] = arb[2*j+1];
      j>>=1;
    }
  }
  
  for(int i=1;i<=M;i++){
    int st,dr;
    fscanf(fin,"%d%d",&st,&dr);
    
    fprintf(fout,"%d\n",go(1,1,N,st,dr));
  }
  
  fclose(fin);
  fclose(fout);
  return 0;
}