Cod sursa(job #1125610)

Utilizator UgleaEduFMI - Edward UgleaEdu Data 26 februarie 2014 18:40:19
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int Bsearch1( int st, int dr, vector <int> &v, int c )
{

    if ( c > v.back() || c < v.front() )

        return -2;

    while ( st <= dr )
    {

        int mid = st + ( dr - st ) / 2;

        if ( v[ mid ] == c )
        {
            while ( v [ mid + 1 ] == c )

                mid ++;

            return mid;
        }

        if ( v[ mid ] > c )

            dr = mid - 1;

        else

            st = mid + 1;

    }

    return -2;

}

int Bsearch2( int st, int dr, vector<int> &v, int c )
{

    while ( st <= dr )
    {

        int mid = st + ( dr - st ) / 2;

        if ( v[ mid ] ==  c )
        {

            while ( v[ mid + 1] == c )

                mid ++;

            return mid;

        }

        if ( v [ mid ] < c )

            st = mid + 1;

        else

            dr = mid - 1;

    }


    return st - 1;

}

int Bsearch3( int st, int dr, vector <int> &v, int c )
{

    while ( st <= dr )
    {

        int mid = st + ( dr - st ) / 2;

        if ( v[ mid ] == c )
        {
            while ( v [ mid - 1 ] == c )

                mid --;

            return mid;
        }

        if ( v[ mid ] < c )

            st = mid + 1;
        else

            dr = mid - 1;

    }

    return st ;

}


int main ()
{

    vector<int> v;
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");

    int n, c, x, aux, m;

    f >> n;

    for ( int i = 0; i < n; i ++ )
    {

        f >> aux;
        v.push_back( aux );

    }

    f >> m;

    for ( int i = 0; i < m; i++ )
    {

        f >> x;
        f >> c;

        switch ( x )
        {
            case 0 : g << Bsearch1( 0, n-1, v, c ) + 1 << '\n';
                break;
            case 1 : g << Bsearch2( 0, n-1, v, c ) + 1 << '\n';
                break;
            case 2 : g << Bsearch3( 0, n-1, v, c ) + 1 << '\n';
                break;
        }

    }

    f.close();
    g.close();





    return 0;

}