Cod sursa(job #1329623)

Utilizator danut.avadaneiDanut Avadanei danut.avadanei Data 29 ianuarie 2015 18:38:35
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
FILE *in, *out;

long int getInt()
{
	long int a;
	fscanf(in,"%lu",&a);
	return a;
}
void init()
{
	in = fopen("cautbin.in","r");
	out = fopen("cautbin.out","w");
}
long int cautBin0(long int *vec, long int len, long int x)
{
	long int mid, st, dr;
	st = 1;
	dr = len;
	while (st <= dr)
	{
		mid = (st + dr) / 2;
		if(vec[mid] <= x)
			st = mid + 1;
		else 
			dr = mid - 1;
	}
	mid = (st + dr) / 2;
	if(vec[mid] > x) mid--;
	if(vec[mid] == x) return mid;
	return -1;
}
long int cautBin1(long int *vec, long int len, long int x)
{
	long int mid, st, dr;
	st = 1;
	dr = len;
	while (st < dr)
	{
		mid = (st + dr) / 2;
		if(vec[mid] <= x)
			st = mid + 1;
		else 
			dr = mid;
	}
	mid = (st + dr) / 2;
	if(vec[mid] > x) mid--;
	return mid;
}
long int cautBin2(long int *vec, long int len, long int x)
{
	long int mid, st, dr;
	st = 1;
	dr = len;
	while (st < dr)
	{
		mid = (st + dr) / 2;
		if(vec[mid] < x)
			st = mid + 1;
		else 
			dr = mid;
	}
	mid = (st + dr) / 2;
	if(vec[mid] > x) mid++;
	return mid;
}

int main()
{
	init();
	
	long int vec[100001],i,n,m,x;
	n = getInt();
	for(i = 1;i <= n;i++)
		vec[i] = getInt();
	m = getInt();
	for(i = 0; i < m;i++)
	{
		switch(getInt())
		{
		case 0:
			x = getInt();
			fprintf(out,"%lu\n",cautBin0(vec,n,x));
			break;
		case 1:
			x = getInt();
			fprintf(out,"%lu\n",cautBin1(vec,n,x));
			break;
		case 2:
			x = getInt();
			fprintf(out,"%lu\n",cautBin2(vec,n,x));
			break;
		default : fprintf(out,"-1\n");
		}
	}
	return 0;
}