Cod sursa(job #2037288)

Utilizator Amalia001Amalia Mican Amalia001 Data 11 octombrie 2017 22:51:18
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.03 kb
#include <fstream>
using namespace std;
ifstream fin ("cautbin.in");
ofstream fout ("cautbin.out");

int CautBin(int n, int x[], int nr);
int main()
{
    int n, x[100000];
    int xmax = 0;
    fin >> n;
    for ( int i = 0; i < n; ++i )
    {
        fin >> x[i];
        if ( x[i] > xmax)
            xmax = x[i];
    }

    int m, Cod, nr;
    fin>>m;
    int p;
    for ( int i = 1; i <= m; ++i)
    {

        fin >> Cod >> nr;
        p = CautBin(n, x, nr);
        switch (Cod)
        {
            case 0:{ if ( p == -1) fout << p <<'\n';
            else
            {
                while (p + 1 < n && x[p+1] == nr)
                ++p;
                fout << p + 1 << '\n';
            }
            break;
            };
            case 1:{
                        if ( p == -1)
                        {
                            nr--;
                            int nrm = CautBin(n, x, nr);
                            while (nrm == -1 && nr > 0)
                            {
                               nr--;
                               nrm = CautBin(n, x, nr);
                            }
                            if(nr > 0)
                            {
                                while ( nrm + 1 < n && x[nrm+1] == nr)
                                nrm++;
                                fout << nrm +1 << '\n';
                            }


                        }
                        else
                        {
                             while (p + 1 < n && x[p+1] == nr)
                                ++p;
                                fout << p + 1 << '\n';
                        }
                        break;
                    };
            case 2:{
                 if ( p == -1)
                        {
                            nr++;
                            int nrm = CautBin(n, x, nr);
                            while (nrm == -1 && nr <=xmax)
                            {
                               nr++;
                               nrm = CautBin(n, x, nr);
                            }
                            if(nr <= xmax)
                            {
                                while ( nrm + 1 < n && x[nrm+1] == nr)
                                nrm++;
                                fout << nrm +1 << '\n';
                            }

                        }
                        else
                        {
                             while (p - 1 >= 0 && x[p-1] == nr)
                                --p;
                                fout << p + 1 << '\n';
                        }

            };
        }

    }
    fin.close();
    fout.close();
    return 0;
}
int CautBin(int n, int x[], int nr)
{
    int s, d, m;
    s = 0;
    d = n-1;
    while(s <= d)
    {
        m = (s+d) / 2;
        if ( nr == x[m]) return m;
        else
        if (nr < x[m] )
            d = m - 1;
            else
            s = m +1;
    }
    return -1;
}