Cod sursa(job #391525)

Utilizator dan_10Dan Alexandru dan_10 Data 5 februarie 2010 20:25:04
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>

long n,m,t,x,k,a[100005],p=-10;

int main()
{	freopen("cautbin.in","r",stdin);
	scanf("%ld",&n);
	for(int i=1;i<=n;i++)
		scanf("%ld",&a[i]);
	scanf("%ld",&m);
	freopen("cautbin.out","w",stdout);
	long i,j,mid,ok;
	while(m>0)
	{	m--;
		scanf("%ld%ld",&t,&x);
		if(t==0)
		{	i=1;
			j=n;
			ok=1;
			while(i<j && ok)
			{ 	mid=i+(j-i)/2;
				if(a[mid]==x) ok=0;
				else if(a[mid]>x) j=mid-1;
				else i=mid+1;
			}
			if(ok==1) printf("-1\n");
			else
			{	while(a[mid]==x && mid<=n ) mid++;
				printf("%ld\n",mid-1);
			}
		}
		if(t==1)
		{	i=1;
			j=n;
			ok=1;
			while(i<j && ok)
			{ 	mid=i+(j-i)/2;
				if(a[mid]==x) ok=0;
				else if(a[mid]>x) j=mid-1;
				else i=mid+1;
			}
			if(ok==0)
			{	while(a[mid]==x && mid<=n) mid++;
				printf("%ld\n",mid-1);
			}
			else printf("%ld\n",mid);
		}
		if(t==2)
		{	i=1;
			j=n;
			ok=1;
			while(i<j && ok)
			{ 	mid=i+(j-i)/2;
				if(a[mid]==x) ok=0;
				else if(a[mid]>x) j=mid-1;
				else i=mid+1;
			}
			if(ok==0)
			{	while(a[mid]==x && 1<=mid) mid--;
				printf("%ld\n",mid+1);
			}
			else printf("%ld\n",mid+1);
		
		}
	//	printf("%ld\n",k);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
	
}