Cod sursa(job #245322)

Utilizator ooctavTuchila Octavian ooctav Data 17 ianuarie 2009 18:44:50
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
// cautare binara.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>

int e[100004];
int n;
int compar( const void *a,const void *b)
{
	return(*(int*)a-*(int*)b);
}
int calcul( FILE *f1, FILE *f2)
{
	int a,m,i,b,j;
	int dr=n,st=1,mid;
	int g,f;
	bool l=false;
	fscanf(f1,"%d",&m);
	for(i=1;i<=m;i++)
	{
		fscanf(f1,"%d %d",&a,&b);
		if(a==0)
		{
			for(j=n;j>=1;j--)
				if(e[j]==b)
				{
					fprintf(f2,"%d\n",j);
					l=true;
				}
				if(!l)
					fprintf(f2,"-1\n");
		}
		else if(a==1)
		{				
			dr=n;
			st=1;
			while(1)
			{
				g=st;
				f=dr;
				mid=st+(dr-st)/2;
				if(e[mid]>b)
					dr=mid;
				if(e[mid]<b)
					st=mid;
				if(e[mid]==b)
					break;
				if(st==g && dr==f)
					break;
			}
			if(e[mid]>b)
				mid--;
			fprintf(f2,"%d\n",mid);
		}
		else
		{
					
			dr=n;
			st=1;
			while(1)
			{
				g=st;
				f=dr;
				mid=st+(dr-st)/2;
				if(e[mid]>b)
					dr=mid;
				if(e[mid]<b)
					st=mid;
				if(e[mid]==b)
					break;
				if(st==g && dr==f)
					break;
			}
			if(e[mid]<b)
				mid++;
			fprintf(f2,"%d\n",mid);
		}
	}
	return 0;
}





int main()
{
	int i;
	FILE *f1,*f2;
	f1=fopen("cautbin.in","r");
	f2=fopen("cautbin.out","w");
	fscanf(f1,"%d",&n);
	for(i=1;i<=n;i++)
		fscanf(f1,"%d",&e[i]);
	qsort(e,n+1,sizeof(int),compar);
	calcul(f1,f2);
	return 0;
}