Cod sursa(job #1414712)

Utilizator OrolesVultur Oroles Data 2 aprilie 2015 22:08:33
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>

unsigned long a[100000];

int zero( int value, unsigned len )
{
    int st = 0;
    int dr = len;
    while ( st <= dr )
    {
        unsigned int m = ( dr - st ) / 2;
        if ( a[m] == value )
        {
            while( a[m] == value )
            {
                ++m;
            }
            return --m;
        }
        if ( a[m] < value )
        {
            st = m; 
        }
        else
        {
            dr = m -1;
        }
    }
    return -1;
}

int unu( int value, unsigned len )
{
    int st = 0;
    int dr = len;
    while ( st < dr )
    {
        unsigned int m = ( dr + st ) / 2;
        if ( a[m] == value )
        {
            while( a[m] == value )
            {
                ++m;
            }
            return --m;
        }
        if ( a[m] < value )
        {
            st = m + 1; 
        }
        else
        {
            dr = m -1;
        }
    }
    return dr;
}

int doi( int value, unsigned len )
{
    int st = 0;
    int dr = len;
    while ( st < dr )
    {
        unsigned int m = ( dr + st ) / 2;
        if ( a[m] == value )
        {
            while( a[m] == value )
            {
                --m;
            }
            return ++m;
        }
        if ( a[m] < value )
        {
            st = m + 1; 
        }
        else
        {
            dr = m -1;
        }
    }
    return st;
}


int main( int argc, char* argv[] )
{
    std::ifstream input("cautbin.in");
    std::ofstream output("cautbin.out");

    int N, M;
    input >> N;
    for ( int i = 0; i < N; ++i )
    {
        input >> a[i];
    }
    input >> M;
    for ( int i = 0; i < M; ++i )
    {
        int first, second;
        input >> first >> second;
        switch( first )
        {
            case 0: output << zero( second, N ) + 1 << std::endl; break;
            case 1: output << unu( second, N ) + 1 << std::endl; break;
            case 2: output << doi( second, N ) + 1 << std::endl; break;
            default: break;
        }
    }

    input.close();
    output.close();
    return 0;
}