Cod sursa(job #699922)

Utilizator Anonymous1010Chilivercu Cristian Anonymous1010 Data 29 februarie 2012 21:58:59
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>

int a[100002],i,n,m,x,caz,ans;

int bs1(int,int);
int bs2(int,int);
int bs3(int,int);

int main()
{
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	
	scanf("%d",&n);
	
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	
	scanf("%d",&m);
	
	for(;m;m--)
	{
		scanf("%d %d",&caz,&x);
		
		if(caz==0)
			ans=bs1(1,n);
		if(caz==1)
			ans=bs2(1,n);
		if(caz==2)
			ans=bs3(1,n);
		
		printf("%d\n",ans);
	}
	
	return 0;
}

int bs1(int l,int r)
{
	int av;
	
	if(l>r)
		return -1;
	else
	{
		av=(l+r)/2;
		if(a[av]==x)
		{
			if(a[av+1]!=x)
				return av;
			else
				return bs1(av+1,r);
		}
		else
		{
			if(a[av]>x)
				return bs1(l,av-1);
			else
				return bs1(av+1,r);
		}
	}
}

int bs2(int l, int r)
{
	int av;
	
	if(l>r)
		return n;
	else
	{
		av=(l+r)/2;
		if(a[av]==x||a[av]<x)
		{
			if(a[av+1]>x)
				return av;
			else
				return bs2(av+1,r);
		}
		else
			return bs2(l,av-1);
	}
}

int bs3(int l, int r)
{
	int av;
	
	if(l>r)
		return 1;
	else
	{
		av=(l+r)/2;
		if(a[av]==x||a[av]>x)
		{
			if(a[av-1]<x)
				return av;
			else
				return bs3(l,av-1);
		}
		else
			return bs3(av+1,r);
	}
}