Cod sursa(job #796339)

Utilizator MtkMarianHagrSnaf MtkMarian Data 11 octombrie 2012 09:20:35
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<cstdio>

#define NMAX 100002
#define INF 1<<20



int n,m,a[NMAX],tip,val,step1;
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 i,step=step1;
	for( step = 1 ; step <= n ; step = ( step << 1 ) );

	for ( i = 0 ; step ; step = ( step >> 1  ) )
		if ( ( i + step ) <= n  ) 
			if( a [ i + step ] <= x )  
			{
				i += step ;
			}

	

if( a[i] != x )return -1;
	return i;	

}


int cautbin2(int x)
{
	int i,step=step1;
	

	for ( i = 0 ; step ; step = ( step >> 1  ) )
		if ( ( i + step ) <= n  ) 
			if( a [ i + step ] <= x )  
			{
				i += step ;
			}


	return i;	

}

int cautbin3(int x)
{
	int i,step=step1;

	for( step = 1 ; step <= n ; step = ( step << 1 ) );

	for ( i = n ; step ; step = ( step >> 1  ) )
		if ( ( i - step ) > 0  ) 
			if( a [ i - step ] >= x )  
			{
				i -= step ;
			}

	return i;	

}
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( step1 = 1 ; step1 <= n ; step1 = ( step1 << 1 ) );

	for (int i=1;i<=m;++i)
		{
			scanf("%d",&tip);
			switch ( tip )
			{

			case 0:

				scanf( "%d" , &val );
				printf( "%d\n" , cautbin ( val ) );
				break;

			case 1:

				scanf( "%d" , &val );		
				printf( "%d\n" ,cautbin2(val) );
				break;

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



			}
	}


	
}