Cod sursa(job #796335)

Utilizator MtkMarianHagrSnaf MtkMarian Data 11 octombrie 2012 09:06:29
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 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 i,step;
	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;
	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 ;
			}

	


	return i;	

}

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

	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 ;
			}

	//while( a [ i ] == x ) ++i;


	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 (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 );
				rez;
				rez=cautbin2(val);
				printf( "%d\n" , rez );
				break;

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



			}
	}


	
}