Cod sursa(job #653629)

Utilizator geniucosOncescu Costin geniucos Data 28 decembrie 2011 16:17:21
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
using namespace std;
int x,tip,i,p,m,u,n,nri,a[100010];
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",&nri);
for(i=1;i<=nri;i++)
{
	scanf("%d",&tip);
	scanf("%d",&x);
	if(tip==0)
	{
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			if(a[m]>x+1) u=m-1;
			else
			if(a[m]<x+1) p=m+1;
			else break;
		}
		if(p>u)
		{
			if(a[p-1]==x) printf("%d\n",p-1);
			else printf("-1\n");
		}
		else
		{
			i=m;
			while(a[i]=x+1) i--;
			if(a[i]==x) printf("%d\n",i);
			else printf("-1\n");
		}
	}
	else
	if(tip==1)
	{
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			if(a[m]>x+1) u=m-1;
			else
			if(a[m]<x+1) p=m+1;
			else break;
		}
		if(p>u) printf("%d\n",p-1);
		else
		{
			i=m;
			while(a[i]==x+1) i--;
			printf("%d\n",i);
		}
	}
	else
	{
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			if(a[m]>x-1) u=m-1;
			else
			if(a[m]<x-1) p=m+1;
			else break;
		}
		if(p>u) printf("%d\n",p);
		else
		{
			i=m;
			while(a[i]==x-1) i++;
			printf("%d\n",i);
		}
	}
}
return 0;
}