Cod sursa(job #1382284)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 8 martie 2015 19:27:27
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#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;
            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 = 0;
            s = S;
            while( s ) {
                if( i + s < N && v[ i + s ] <= x )
                    i += s;
                s >>= 1;
            }
            fprintf( g, "%d\n", i + 1 );
        } 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;
}