Cod sursa(job #320837)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 5 iunie 2009 22:49:35
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<stdio.h>

#define X 100001

void bns1(int v[], int st, int dr, int x, int &val)
{
	if(st>dr) return;
	int mij=st+(dr-st)/2;
	if(v[mij]==x)
	{
		val=mij;
		if(mij+1<=dr) bns1(v,mij+1,dr,x,val);
	}
	else if(v[mij]<x) bns1(v,mij+1,dr,x,val);
		 else bns1(v,st,mij-1,x,val);
}

void bns2(int v[], int st, int dr, int x, int &val)
{
	if(st>dr) return;
	int mij=st+(dr-st)/2;
	if(v[mij]<=x)
	{
		val=mij;
		if(mij+1<=dr) bns2(v,mij+1,dr,x,val);
	}
	else if(v[mij]<x) bns2(v,mij+1,dr,x,val);
		 else bns2(v,st,mij-1,x,val);
}

void bns3(int v[], int st, int dr, int x, int &val)
{
	if(st>dr) return;
	int mij=st+(dr-st)/2;
	if(v[mij]>=x)
	{
		val=mij;
		if(st<=mij-1) bns3(v,st,mij-1,x,val);
	}
	else if(v[mij]<x) bns3(v,mij+1,dr,x,val);
		 else bns3(v,st,mij-1,x,val);
}

int main()
{
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	
	int v[X],n,m,i,x,y,val;
	
	scanf("%d",&n);
	for(i=1; i<=n; ++i) scanf("%d",&v[i]);
	
	scanf("%d",&m);
	for(; m; --m)
	{
		scanf("%d %d",&x, &y);
		switch(x)
		{
			case 0:
				val=0;
				bns1(v,1,n,y,val);
				if(v[val]==y) printf("%d\n",val);
						 else printf("-1\n");
				break;
			case 1:
				val=0;
				bns2(v,1,n,y,val);
				printf("%d\n",val);
				break;
			case 2:
				val=0;
				bns3(v,1,n,y,val);
				printf("%d\n",val);
				break;
		}
	}
	
	return 0;
}