Cod sursa(job #2290124)

Utilizator TudorskiSintoma Tudor Tudorski Data 25 noiembrie 2018 19:57:51
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.68 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int caut0( int x, vector <int>& v ){
    int stg = 0, drp = (int)v.size() - 1;
    while( stg <= drp ){
        int mij = ( stg + drp ) / 2;
        if( v[mij] == x ){
            while( ( mij < drp ) && ( v[mij+1] == x ) )
                mij++;
            return mij;
        }
        if ( v[mij] > x )
            drp = mij - 1;
        else
            stg = mij + 1;
    }
    return -1;
}
int caut1( int x, vector <int>& v ){
    int stg = 0, drp = (int)v.size() - 1;
    while( stg <= drp ){
        int mij = ( stg + drp ) / 2;
        if( v[mij] == x ){
            while( ( mij < drp ) && ( v[mij+1] == x ) )
                mij++;
            return mij;
        }
        if ( v[mij] > x )
            drp = mij - 1;
        else
            stg = mij + 1;
    }
    return drp;
}
int caut2( int x, vector <int>& v ){
    int stg = 0, drp = (int)v.size() - 1;
    while ( stg <= drp ){
        int mij = ( stg + drp ) / 2;
        if( v[mij] == x ){
            while ( ( mij > stg ) && (v[mij-1] == x ) )
                mij--;
            return mij;
        }
        if ( v[mij] > x )
            drp = mij - 1;
        else
            stg = mij + 1;
    }
    return stg;
}

int main()
{
    vector <int> v;
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");

    int N;
    fin >> N;
    for( int i = 1; i <= N; i++ ){
        int aux;
        fin >> aux;
        v.push_back(aux);
    }
    int M, poz = 0;
    fin >> M;
    for( int i = 1; i <= M; i++ ){
        int intr, nr;
        fin >> intr;
        fin >> nr;
        if ( intr == 0 )
            poz = caut0(nr, v);
        else{
            if ( intr == 1 ){
                poz = caut1(nr, v);
                if ( v[poz] != nr ){
                    if ( v[poz] < nr ){
                        while ( v[poz] < nr ){
                            poz++;
                        }
                        poz++;
                    }else{
                        while ( v[poz] > nr )
                            poz--;
                    }
                }

            }else{
                poz = caut2(nr, v);
                if ( v[poz] != nr ){
                    if ( v[poz] > nr ){
                        while ( v[poz] > nr ){
                            poz--;
                        }
                    }else {
                        while ( v[poz] < nr ){
                            poz++;
                        }
                        poz++;
                    }
                }

            }
        }
    }

    return 0;
}