Cod sursa(job #199164)

Utilizator cipPaduraru Ciprian - Ionut cip Data 17 iulie 2008 11:53:02
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>

#define MAXD	100000

int Numbers[MAXD], n , q ,x ,result;

void cautBin1(int i, int j ,int x)
{
	if (i <= j)
	{
		int mijloc = i + ((j - i)>>1);
		if (Numbers[mijloc] <= x)
		{
			if (Numbers[mijloc] == x)
				result = mijloc;

			cautBin1(mijloc + 1 , j, x);
		}
		else
			cautBin1(i , mijloc - 1, x);
	}
}

void cautBin2(int i, int j, int x)
{
	if (i <= j)
	{
		int mijloc = i + ((j - i)>>1);
		if (Numbers[mijloc] <= x)
		{
			result = mijloc;
			cautBin2(mijloc + 1 , j , x);
		}
		else
			cautBin2(i, mijloc - 1 , x);
	}
}

void cautBin3(int i , int j , int x)
{
	if (i <= j)
	{
		int mijloc = i + ((j - i)>>1);
		if (Numbers[mijloc] < x)
			cautBin3(mijloc + 1, j, x);
		else
		{
			result = mijloc ;
			cautBin3(i, mijloc - 1 , x);
		}
	}
}

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

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

	scanf("%d",&q);
	for (int i = 0 ; i < q; i ++)
	{
		int type;
		scanf("%d %d", &type,&x);
		switch(type)
		{
			case 0 :
				 result = -1;
				 cautBin1(0,n -1 ,x);
				 break;
			case 1:
				 cautBin2(0,n - 1,x);
				 break;
			default:
				 cautBin3(0,n -1 ,x);
				 break;
		}

		printf("%d\n",result + 1);
	}

	return 0;
}