Cod sursa(job #1510479)

Utilizator jimcarterJim Carter jimcarter Data 25 octombrie 2015 02:36:56
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
using namespace std;

FILE *f = fopen ( "cautbin.in" , "r" ) , *g = fopen ( "cautbin.out" , "w" );

const int MAX = 100005;
int N , i , myInts [ MAX ] , NrRequests , mid , value , type , index;

void read()
{
    fscanf ( f , "%d" , &N );
    for ( i = 0 ; i < N ; i ++ )
        fscanf ( f , "%d" , &myInts [ i ] );
    fscanf ( f , "%d" , &NrRequests );
}

int maxBinSearch ( int left , int right , int value )
{
    while ( left + 1 < right )
    {
        mid = ( left + right ) / 2;
        if ( myInts [ mid ] > value )
            right = mid;
        else
            left = mid + 1;
    }
    if ( myInts [ left ] > value )
        left --;
    return left;
}

int minBinSearch ( int left , int right , int value )
{
    while ( left + 1 < right )
    {
        mid = ( left + right ) / 2;
        if ( myInts [ mid ] < value )
            left = mid + 1;
        else
            right = mid;
    }
    if ( myInts [ left ] < value )
        left ++;
    return left;
}

void deal()
{
    // we print index + 1 instead of index because we're using myInts[0..N)
    for ( i = 0 ; i < NrRequests ; i ++ )
    {
        fscanf ( f , "%d %d\n" , &type , &value );
        if ( type == 2 )
        {
            index = minBinSearch ( 0 , N , value );
            fprintf ( g , "%d\n" , index + 1 );
        }
        else
        {
            index = maxBinSearch ( 0 , N , value );
            if ( type == 1 )
                if ( value == myInts [ index ] )
                    fprintf ( g , "%d\n" , index + 1 );
                else
                    fprintf ( g , "-1\n" );
            else
                fprintf ( g , "%d\n" , index + 1 );
        }
    }
}

int main()
{
    read();

    deal();
    return 0;
}