Cod sursa(job #245929)

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

int main()
{
	int n,v[100001],m,tipm,x,l1,l2;
	char prost=1;
	freopen ("cautbin.in","r",stdin);
	freopen ("cautbin.out","w",stdout);
	scanf ("\n%d",&n);
	for (int i = 1; i <= n; ++i)
		scanf ("\n%d",&v[i]);
	scanf ("\n%d",&m);
	for (int nrm = 1; nrm <= m; ++nrm)
	{
		scanf ("%d%d",&tipm,&x);
		if (x > v [n])
			if (tipm==0)
				if (prost)
				{
					printf ("%d",-1);
					prost=0;
				}
				else printf ("\n%d",-1);
			else if (prost)
				{
					printf ("%d",n);
					prost=0;
				}
				else printf ("\n%d",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)
					if (prost)
					{
						printf ("%d",l1);
						prost=0;
					}
					else printf ("\n%d",l1);
				else if (v [l2] == x)
						if (prost)
						{
							printf ("%d",l2);
							prost=0;
						}
						else printf ("\n%d",l2);
					else if (prost)
						{
							printf ("%d",-1);
							prost=0;
						}
						else printf ("\n%d",-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;
				if (prost)
				{
					printf ("%d",l1);
					prost=0;
				}
				else printf ("\n%d",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;
				if (prost)
				{
					printf ("%d",l2);
					prost=0;
				}
				else printf ("\n%d",l2);
				break;
			}
		}
	}
	return 0;
}