Cod sursa(job #1245246)

Utilizator radudorosRadu Doros radudoros Data 18 octombrie 2014 20:14:33
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;

int a[100001];
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

int egalx(int k, int n)
{
	int lo = 1;
	int hi = n;
	int max = -1;
	while (hi - lo >= 1)
	{
		int m = lo + (hi - lo) / 2;
		if (a[m] > k)
		{
			hi = m - 1;
		}
		else
		{
			if (a[m] == k)
			{
				max = m;
			}
			lo = m+1;
		}
	}
	if (a[lo] == k)
		return lo;
	return max;
}

int mmicx(int k, int n)
{
	if (a[1]>k) return -1;
	
	int lo = 1;
	int hi = n;
	int max = -1;
	while (hi - lo >= 1)
	{
		int m = lo + (hi - lo) / 2;
		if (a[m] > k)
		{
			hi = m - 1;
		}
		else
		{
			max = m;
			lo = m + 1;
		}
	}
	if (a[lo] <= k)
		return lo;
	return max;
}



int mmarex(int k, int n)
{

	int lo = 1;
	int hi = n;
	int max = -1;
	while (hi - lo >= 1)
	{
		int m = lo + (hi - lo) / 2;
		if (a[m] >= k)
		{
			max = m;
			hi = m - 1;
		}
		else
		{
			lo = m + 1;
		}
	}
	if (a[lo] >= k)
		return lo;
	return max;

}

int main()
{
	int n;
	fin >> n;
	for (int i = 1; i <= n; i++)
	{
		fin >> a[i];
	}
	int m;
	fin >> m;
	for (int i = 1; i <= m; i++)
	{
		int aux;
		fin >> aux;
		if (aux == 0)
		{
			int x;
			fin >> x;
			fout << egalx(x, n) << '\n';
		}
		if (aux == 1)
		{
			int x;
			fin >> x;
			fout << mmicx(x, n) << '\n';
		}
		if (aux == 2)
		{
			int x;
			fin >> x;
			fout << mmarex(x, n) << '\n';
		}
	}
}