Cod sursa(job #795456)

Utilizator MtkMarianHagrSnaf MtkMarian Data 8 octombrie 2012 20:48:50
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<cstdio>

#define NMAX 100002
#define INF 1<<20



int n,m,a[NMAX],tip,val,rez,rez1;
inline int max (int a ,int b)
{
	return a > b ? a  : b ;
}
inline int min (int a ,int b)
{
	return a < b ? a  : b ;
}
int cautbin(int x,int left,int right)
{
	if( left > right ) return -1;

	int mid=left+(right-left)/2;

	if ( a [ mid ] == x ) 
		{
			while ( a [ mid ] == x  ) ++mid;
			return --mid;
		}
	  
	if( a [ mid ] > x )
		cautbin(x,left,mid-1);
	else
		cautbin(x,mid+1,right);

}


int cautbin2(int x,int left,int right)
{
	if( left > right ) return -1;

	int mid=left+(right-left)/2;
	  
	if( a [ mid ] > x )
		cautbin2(x,left,mid-1);
	else
	{
		rez=mid;
		cautbin2(x,mid+1,right);
	}

}

int cautbin3(int x,int left,int right)
{
	if( left > right ) return -1;

	int mid=left+(right-left)/2;
	  
	if( a [ mid ] >= x )
	{
		rez1=mid;
		cautbin3(x,left,mid-1);
	}
	else	
		cautbin3(x,mid+1,right);
	

}
int main()
{
	freopen("cautbin.in","r",stdin);
	freopen("cautbin.out","w",stdout);
	scanf("%d",&n);

	for(int i=1;i<=n;++i)scanf("%d",&a[i]);
	scanf("%d",&m);

	for (int i=1;i<=m;++i)
		{
			scanf("%d",&tip);
			switch ( tip )
			{
			case 0:
				scanf( "%d" , &val );
				printf( "%d\n" , cautbin ( val, 1,n ) );
				break;

			case 1:

				scanf( "%d" , &val );
				rez=INF;
				cautbin2(val,1,n);
				printf( "%d\n" , rez );
				break;

			case 2:
				scanf( "%d" , &val );
				rez1=-1;
				cautbin3(val,1,n);
				printf( "%d\n" , rez1 );



			}
	}


	
}