Pagini recente » Cod sursa (job #1916813) | Cod sursa (job #2491516) | Cod sursa (job #574622) | Cod sursa (job #2288789) | Cod sursa (job #796339)
Cod sursa(job #796339)
#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));
}
}
}