Pagini recente » Cod sursa (job #2339914) | Cod sursa (job #2250232) | Cod sursa (job #2227754) | Cod sursa (job #2973648) | Cod sursa (job #1382276)
#include <cstdio>
using namespace std;
#define IN_FILE "cautbin.in"
#define OUT_FILE "cautbin.out"
#define MAX_N 100000
int v[ MAX_N ];
inline int msb( const int &val ) { // cea mai mare putere a lui 2 < N
int a = val - 1;
for( int i = 0; i < 5; ++i )
a |= a >> ( 1 << i );
return ( a + 1 ) >> 1;
}
int main( ) {
FILE *f, *g;
char op;
int N, S, Q, x, i, s;
f = fopen( IN_FILE, "r" );
fscanf( f, "%d", &N );
for( i = 0; i != N; ++i )
fscanf( f, "%d", v + i );
fscanf( f, "%d\n", &Q );
S = !( N & ( N - 1 ) ) ? N : msb( N );
g = fopen( OUT_FILE, "w" );
while( Q-- ) {
fscanf( f, " %c %d", &op, &x );
if( op == '0' ) {
i = N - 1;
s = S;
while( s ) {
if( i - s >= 0 && v[ i - s ] > x )
i -= s;
s >>= 1;
}
if( v[ i - 1 ] == x )
fprintf( g, "%d\n", i );
else
fputs( "-1\n", g );
} else if( op == '1' ) {
i = N - 1;
s = S;
while( s ) {
if( i - s >= 0 && v[ i - s ] > x )
i -= s;
s >>= 1;
}
fprintf( g, "%d\n", i );
} else {
i = N - 1;
s = S;
while( s ) {
if( i - s >= 0 && v[ i - s ] >= x )
i -= s;
s >>= 1;
}
fprintf( g, "%d\n", i + 1 );
}
}
fclose( f );
fclose( g );
return 0;
}