Cod sursa(job #997988)

Utilizator diac_paulPaul Diac diac_paul Data 15 septembrie 2013 13:38:06
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#define NMax 100005

int n, v[NMax];

int cbin0(int val)
{
	if (v[n-1] == val)
		return val;

	int lo = 0, hi = n-1, mi;

	while (hi - lo > 1)
	{
		mi = lo + (hi - lo) / 2;
		if (v[mi] > val)
			hi = mi;
		else
			lo = mi;
	}

	if (v[lo] == mi)
		return lo;
	return -1;		
}

int cbin1(int val)
{
	int lo = 0, hi = n-1, mi;

	while (hi - lo > 1)
	{
		mi = lo + (hi - lo) / 2;
		if (v[mi] > val)
			hi = mi;
		else
			lo = mi;
	}

	if (v[hi] <= mi)
		return hi;
	return lo;
}
int cbin2(int val)
{
	int lo = 0, hi = n-1, mi;

	while (hi - lo > 1)
	{
		mi = lo + (hi - lo) / 2;
		if (v[mi] < val)
			lo = mi;
		else
			hi = mi;
	}

	if (v[lo] >= val)
		return lo;
	return hi;
}

int main()
{
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);

	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &v[i]);

	int t;
	scanf("%d", &t);

	while (t--)
	{
		int op, val;
		scanf("%d %d", &op, &val);

		if (op == 0)
			printf("%d\n", cbin0(val) + 1);
		if (op == 1)
			printf("%d\n", cbin1(val) + 1);
		if (op == 2)
			printf("%d\n", cbin2(val) + 1);
	}	

	return 0;
}