Cod sursa(job #1449517)

Utilizator PlatonVPlaton Vlad PlatonV Data 9 iunie 2015 21:18:55
Problema Cautare binara Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

int N, a[100000];

void read()
{
    f >> N;
    for (int i = 0; i < N; ++i)
        f >> a[i];
}

int binara1(int x)
{
    int st = 0;
    int dr = N-1;

    while (dr - st > 1)
    {
        int mij = (st + dr) / 2;

        if (x > a[mij])
            st = mij;
        if (x < a[mij])
            dr = mij;

        if (x == a[mij])
        {
            while (x == a[mij])
                mij++;
            return mij;
        }
    }

    return -1;
}

int binara2(int x)
{
    int st = 0;
    int dr = N-1;
    int pos;
    while (dr - st > 1)
    {
        int mij = (st + dr) / 2;
        pos = mij;

        if (x > a[mij])
            st = mij;
        if (x < a[mij])
            dr = mij;
        if (x == a[mij])
        {
            while (a[mij] == x)
                mij++;
            return mij;
        }
    }
    return st+1;
}

int binara3(int x)
{
    int st = 0;
    int dr = N-1;
    int pos;

    while (dr - st > 1)
    {
        int mij = (st + dr) / 2;
        pos = mij;

        if (x > a[mij])
            st = mij;
        if (x < a[mij])
            dr = mij;
        if (x == a[mij])
        {
            while (a[mij] == x)
                mij--;
            return mij+2;
        }
    }
    return dr+1;
}

int main()
{
    read();

    int k;
    f>>k;
    for (int o = 0; o < k; ++o)
    {
        int instr, val;
        f >> instr >> val;
        if (instr == 0)
            g << binara1(val) << endl;
        else if (instr == 1)
            g << binara2(val) << endl;
        else g << binara3(val) << endl;
    }
    return 0;
}