Cod sursa(job #1680199)

Utilizator zurzic_doruzurzic zeljko zurzic_doru Data 8 aprilie 2016 16:09:05
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>

int cauta1(int v[], int x, int start, int stop)
{
	int mid;
	if ( start > stop )
		return -2;
	mid = start + ( stop - start ) / 2;
	if ( v[mid] == x && v[mid+1] > x )
		return mid;
	if ( v[mid] == x )
		return cauta1(v, x, mid+1, stop);
	if ( v[mid] < x )
		return cauta1(v, x, mid+1, stop);
	return cauta1(v, x, start, mid-1);
}

int cauta2(int v[], int x, int start, int stop)
{
	int mid;
	mid = start + ( stop - start ) / 2;
	if ( v[mid] <= x && v[mid+1] > x )
		return mid;
	if ( v[mid] > x )
		return cauta2(v, x, start, mid-1);
	return cauta2(v, x, mid+1, stop);
}

int cauta3(int v[], int x, int start, int stop)
{
	int mid;
	mid = start + ( stop - start ) / 2;
	if ( v[mid] >= x && v[mid-1] < x )
		return mid;
	if ( v[mid] >= x )
		return cauta3(v, x, start, mid-1);
	return cauta3(v, x, mid+1, stop);
}

int main()
{
	int v[100000], i, n, x, q, nr;
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);
	scanf("%d", &n);
	for ( i = 0; i <= n - 1; i ++ )
		scanf("%d", &v[i]);
	
	scanf("%d", &q);
	for ( i = 1; i <= q; i++ )
	{
		scanf("%d%d", &nr, &x);
		if ( nr == 0 )
			printf("%d\n", cauta1(v, x, 0, n-1) + 1);
		if ( nr == 1 )
			printf("%d\n", cauta2(v, x, 0, n-1) + 1);
		if ( nr == 2 )
			printf("%d\n", cauta3(v, x, 0, n-1) + 1);
	}
	
}