Cod sursa(job #154421)

Utilizator moga_florianFlorian MOGA moga_florian Data 11 martie 2008 10:32:14
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>

int A[100010][20];
int p2[25];

int main(){

  FILE *fin = fopen("rmq.in","r"),
       *fout = fopen("rmq.out","w");
       
  int N,M;
  fscanf(fin,"%d%d",&N,&M);
  
  for(int i=1;i<=N;i++)
    fscanf(fin,"%d",&A[i][0]);
    
  int lim = 0;
  while( (1<<lim) <= N ) lim++;
  lim --;
  
  p2[0] = 1;
  for(int i=1;i<=lim+1;i++) p2[i] = 2*p2[i-1];
  
  for(int j=1;j<=lim;j++)
    for(int i=1;i<=N;i++){
      A[i][j] = A[i][j-1];
      if(i+p2[j-1] <= N && A[i+p2[j-1]][j-1] < A[i][j])
        A[i][j] = A[i+p2[j-1]][j-1];        
    }
  /*  
  for(int i=1;i<=N;i++){
    for(int j=0;j<=lim;j++)
      fprintf(fout,"%d ",A[i][j]);
    fprintf(fout,"\n");
  }
  */  
  for(int i=1;i<=M;i++){
    int li,lf;
    fscanf(fin,"%d%d",&li,&lf);
    
    int k = 0;
    while(p2[k] <= lf-li+1) k++;
    k--;
    
    int sol = 10000000;
    while(k>=0){
       if(p2[k] > lf-li+1)
         k--;
       else{
         if(A[li][k] < sol)
            sol = A[li][k];
         li+=p2[k];
         k--;   
       }
    } 
    
    fprintf(fout,"%d\n",sol);
  }
    
  fclose(fin);
  fclose(fout);
  return 0;
  
}