Cod sursa(job #1968764)

Utilizator andrei232000Andrei Maria andrei232000 Data 17 aprilie 2017 20:47:52
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int sir[100005];
int N, M;
int i, x, p;
int cautare_binara(int e, int op)
{
    int i2 = N - 1;
    int i1 = 0;
    int mij;
    while(i2 - i1 > 1)
    {
        mij = (i1 + i2) / 2;
        if(sir[mij] < e)
        {
            i1 = mij;
        }
        else if(sir[mij] > e)
        {
            i2 = mij;
        }
        else
        {
            if(op == 0)
            {
                while(sir[mij] == e)
                {
                    ++mij;
                }
                return mij - 1;
            }
            else if(op == 1)
            {
                while(sir[mij] == e)
                {
                    ++mij;
                }
                return mij - 1;
            }
            else
            {
                while(sir[mij] == e)
                {
                    --mij;
                }
                return mij + 1;
            }
        }
    }
    if(op == 0)
    {
        if(sir[i1] == e)
        {
            mij = i1;
            while(sir[mij] == e)
            {
                ++mij;
            }
            return mij - 1;
        }
        else if(sir[i2] == e)
        {
            mij = i2;
            while(sir[mij] == e)
            {
                ++mij;
            }
            return mij - 1;
        }
        else return -2;
    }
    else if(op == 1)
    {
        if(e < sir[i2])
        {
            return i1;
        }
        else return i2;
    }
    else
    {
        if(e > sir[i1])
        {
            return i2;
        }
        else return i1;
    }
}
int main()
{
    fin>>N;
    for(i = 0; i < N; ++i)
    {
        fin>>sir[i];
    }
    fin>>M;
    for(i = 0; i < M; ++i)
    {
        fin>>p>>x;
        fout<<cautare_binara(x, p) + 1<<'\n';
    }
    return 0;
}