Cod sursa(job #1119042)

Utilizator BonCipBonciocat Ciprian Mircea BonCip Data 24 februarie 2014 14:44:15
Problema Cautare binara Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.51 kb
#include <stdio.h>

#define N_MAX 100000

int N, M, v[ N_MAX + 1 ];

int bs0( int val ) {
    int beg = 1, end = N + 1;
    while( end - beg > 1 ) {
        int med = ( beg + end ) / 2;
        if( v[ med ] <= val ) {
            beg = med;
        } else {
            end = med;
        }
    }
    return v[ beg ] == val ? beg : -1;
} 

int bs1( int val ) {
    int beg = 1, end = N + 1;
    while( end - beg > 1 ) {
        int med = ( beg + end ) / 2;
        if( v[ med ] <= val ) {
            beg = med;
        } else {
            end = med;
        }
    }
    return beg;
}

int bs2( int val ) {
    int beg = 1, end = N + 1;
    while( end - beg > 1 ) {
        int med = ( beg + end ) / 2;
        if( v[ med ] >= val ) {
            end = med;
        } else {
            beg = med;
        }
    }
    return end;
}

int main( ) {
    FILE * fin, * fout;
    fin = fopen( "cautbin.in", "r" );
    fout = fopen( "cautbin.out", "w" );

    fscanf( fin, "%d", &N );

    int i;
    for( i = 1; i <= N; i ++ ) {
        fscanf( fin, "%d", v + i );
    }

    fscanf( fin, "%d", &M );

    for( i = 1; i <= M; i ++ ) {
        int type, val;
        fscanf( fin, "%d%d", &type, &val );
        switch( type ) {
            case 0:
                fprintf( fout, "%d\n", bs0( val ) );
                break;
            case 1:
                fprintf( fout, "%d\n", bs1( val ) );
                break;
            case 2:
                fprintf( fout, "%d\n", bs2( val ) );
        }
    }

    fclose( fin );
    fclose( fout );
}