Cod sursa(job #264618)

Utilizator mrpopescuPopescu Mihai Tudor mrpopescu Data 22 februarie 2009 15:06:39
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LMAX 100000
#define LOGMAX 5
#define deschidere(cale,mod,flux)\
	if((flux=fopen(cale,mod))==NULL){\
   	printf("\nNu se poate deschode %s.\n",cale);\
      exit(1);\
   }
long int m[LMAX][LOGMAX],v[LMAX];
void formare(long int n){
	long int i,j;
   for(i=0;i<n;i++) m[i][0]=i;
   for(j=1;(1<<j)<=n;j++)
   	if(v[m[i][j-1]]<v[m[i+(1<<(j-1))][j-1]])
      	m[i][j]=m[i][j-1];
       else
       	m[i][j]=m[i+(1<<(j-1))][j-1];
}
long int lg(long int n){
	int i=0;
   while(pow(10,i)<=n) i++;
   return i;
}
long int rmq(long int p,long int q,long int n){
	long int k=lg(n);
   if(v[m[p][k]]<=v[m[q-(1<<k)+1][k]])
   	return m[p][k];
    else return m[q-(1<<k)+1][k];
}
int main(){
	long int p,q,n,k,i;
   FILE *f,*g;
   deschidere("rmq.in","rt",f);
   fscanf(f,"%ld",&n);
   for(i=0;i<n;i++)
   	fscanf(f,"%ld",&v[i]);
   formare(n);
   fscanf(f,"%ld",&k);
   deschidere("rmq.out","wt",g);
   for(i=0;i<k;i++){
   	fscanf(f,"%ld %ld",&p,&q);
      p--;q--;
      fprintf(g,"%ld\n",v[rmq(p,q,n)]);
   }
   fclose(f);fclose(g);
   return 0;
}