Cod sursa(job #263512)

Utilizator nightwish0031Vlad Radu Cristian nightwish0031 Data 20 februarie 2009 15:30:43
Problema Cautare binara Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
long x[100002];

long cb1(long st,long dr,long v)
{
 long m;

 if (st<=dr)
 {

 m=(st+dr)/2;

  if (x[m+1]!=v&&v==x[m])
	return m;
	else
	 if (v>=x[m])
  return cb1(m+1,dr,v);
 else
	return cb1(st,m-1,v);
 }
return -1;
}

long cb2(long st,long dr,long v,long max,long maxi)
{
long m;

 if (st<=dr)
  {

	m=(st+dr)/2;
	 if (v>=x[m])
	  {
		if (max<=x[m]) {max=x[m];maxi=m;}
		 return cb2(m+1,dr,v,max,maxi);
	  }
	 else
	  return cb2(st,m-1,v,max,maxi);
	}



 return maxi;
}


long cb3(long st,long dr,long v,long max,long maxi)
{
 long m;

  if (st<=dr)
	{
	 m=(st+dr)/2;

	  if (x[m]>=v)
		{
		 if (x[m]<=max) {max=x[m];maxi=m;}
		  return cb3(st,m-1,v,max,maxi);
		}
	  else
		return cb3(m+1,dr,v,max,maxi);
	}
  return maxi;

}

int main()
{
long n,m,i,t,k,l;

  freopen("cautbin.in","r",stdin);
  freopen("cautbin.out","w",stdout);

  scanf("%ld",&n);
  for (i=1;i<=n;i++)
	 scanf("%ld",&x[i]);

  scanf("%ld",&m);
  for (i=1;i<=m;i++)
	{
	 scanf("%ld%ld",&t,&k);
	  if (t==0)
		l=cb1(1,n,k);
	  else
		if (t==1)
		 l=cb2(1,n,k,0,0);
		else
		 if (t==2)
		  l=cb3(1,n,k,100002,0);

	 printf("%ld\n",l);


	}

return 0;
}