Cod sursa(job #263798)

Utilizator mrpopescuPopescu Mihai Tudor mrpopescu Data 20 februarie 2009 20:13:39
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1 kb
#include <stdio.h>
#include <stdlib.h>
#define LMAX 100000
#define deschidere(cale,mod,flux)\
	if((flux=fopen(cale,mod))==NULL){\
   	printf("\nNu se poate deschode %s.\n",cale);\
      exit(1);\
   }
void matrice(int m[LMAX][5],int a[LMAX],int n){
	int i,j;
   for(i=0;i<n;i++) m[i][0]=a[i];
   for(j=0;(1<<j)<=n;j++)
   	if(a[m[i][j-1]]<a[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 rmq(int p,int q,int m[LMAX][5],int a[LMAX]){
	int k=log(q-p+1);
   if(a[m[p][k]]<=a[m[q-(1<<k)+1][k]])
   	return m[p][k];
    else return m[q-(1<<k)+1][k];
}
int main(){
	FILE *f,*g;
   int matr[LMAX][5],n,m,a[LMAX],p,q,i;
   deschidere("rmq.in","rt",f);
   fscanf(f,"%d",&n);
   for(i=0;i<n;i++)
   	fscanf(f,"%d",&a[i]);
   matrice(matr,a,n);
   fscanf(f,"%d",&m);
   deschidere("rmq.out","wt",g);
   for(i=0;i<m;i++){
   	fscanf(f,"%d %d",&p,&q);
      fprintf(g,"%d\n",a[rmq(p,q,matr,a)]);
      }
   fclose(f);
   fclose(g);
   return 0;
}