Cod sursa(job #1411673)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 31 martie 2015 21:17:11
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

const int MAX_N(100001);
const int MAX_LOG(16);

int n;
int v [MAX_N];

inline int Search1 (int val)
{
	int result(0);
	for (int i(1 << MAX_LOG); i; i >>= 1)
	{
		if (result + i > n)
			continue;
		if (v[result + i] <= val)
			result += i;
	}
	return result;
}

inline int Search2 (int val)
{
	int left(1), right(n), middle((left + right) / 2);
	while (left < right)
	{
		if (v[middle] < val)
			left = middle + 1;
		else
			right = middle;
		middle = (left + right) / 2;
	}
	return middle;
}

int main (void)
{
	std::ifstream input("cautbin.in");
	std::ofstream output("cautbin.out");
	input >> n;
	for (int i(1) ; i <= n ; ++i)
		input >> v[i];
	int m;
	input >> m;
	int q, num;
	while (m--)
	{
		input >> q >> num;
		if (q == 0)
		{
			int result(Search1(num));
			output << (v[result] == num ? result : -1);
		}
		else if (q == 1)
			output << Search1(num);
		else
			output << Search2(num);
		output.put('\n');
	}
	input.close();
	output.close();
	return 0;
}