Cod sursa(job #264472)

Utilizator mrpopescuPopescu Mihai Tudor mrpopescu Data 22 februarie 2009 10:49:54
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <stdlib.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);\
   }
int m[LMAX][LOGMAX],v[LMAX];
void formare(int n){
	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];
}
int lg(int n){
	int i, k[LMAX];
   k[0]=1;
   for(i=1;i<n;i++)
   	k[i]=k[(i+1)/2-1]+1;
   return k[n-1];
}
int rmq(int p,int q,int n){
	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(){
	int p,q,n,k,i;
   FILE *f,*g;
   deschidere("rmq.in","rt",f);
   fscanf(f,"%d",&n);
   for(i=0;i<n;i++)
   	fscanf(f,"%d",&v[i]);
   formare(n);
   fscanf(f,"%d",&k);
   deschidere("rmq.out","wt",g);
   for(i=0;i<k;i++){
   	fscanf(f,"%d %d",&p,&q);
      p--;q--;
      fprintf(g,"%d\n",v[rmq(p,q,n)]);
   }
   fclose(f);fclose(g);
   return 0;
}