Cod sursa(job #245926)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 19 ianuarie 2009 13:42:54
Problema Cautare binara Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>

int main()
{
	int n,v[100001],m,tipm,x,l1,l2;
	freopen ("cautbin.in","r",stdin);
	freopen ("cautbin.out","w",stdout);
	scanf ("%d",&n);
	for (int i = 1; i <= n; ++i)
		scanf ("%d",&v[i]);
	scanf ("%d",&m);
	for (int nrm = 1; nrm <= m; ++nrm)
	{
		scanf ("%d%d",&tipm,&x);
		if (x > v [n])
			if (tipm==0)
				printf ("%d\n",-1);
			else printf ("%d\n",n);
		else
		{
			switch (tipm)
			{
			case 0:
				l1=1;
				l2=n;
				while ((v [l1] < x)&&(v [l2] > x)&&(l1+1<l2))
					if (v [(l1+l2)/2] < x)
						l1 = (l1+l2)/2;
					else l2 = (l1+l2)/2;
				if (v [l1] == x)
					printf ("%d\n",l1);
				else if (v [l2] == x)
						printf ("%d\n",l2);
					else printf ("%d\n",-1);
				break;
			case 1:
				l1=1;
				l2=n;
				while ((v [l1] < x)&&(v [l2] > x)&&(l1+1<l2))
					if (v [(l1+l2)/2] < x)
						l1 = (l1+l2)/2;
					else l2 = (l1+l2)/2;
				printf ("%d\n",l1);
				break;
			case 2:
				l1=1;
				l2=n;
				while ((v [l1] < x)&&(v [l2] > x)&&(l1+1<l2))
					if (v [(l1+l2)/2] < x)
						l1 = (l1+l2)/2;
					else l2 = (l1+l2)/2;
				printf ("%d\n",l2);
				break;
			}
		}
	}
	return 0;
}