Cod sursa(job #1129449)

Utilizator acelasiStanciu Rares acelasi Data 27 februarie 2014 22:18:07
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
using namespace std;

int CautareBinara(int v[100001], int nr, int lo, int hi)
{
    if (hi < lo)
        return -1;
    else
    {
        int mid =lo + (hi - lo) / 2;
        if (v[mid] > nr)
            return CautareBinara(v, nr, lo, mid - 1);
        else if (v[mid] < nr)
            return CautareBinara(v, nr, mid + 1, hi);
        else
            return mid;
    }

}


int MaiMare(int v[100001], int nr, int lo, int hi)
{
    int poz = CautareBinara(v, nr, lo, hi);
    if (poz == -1)
        return -1;
    else
    {
        while (v[poz + 1] == nr)
            poz++;
        return poz + 1;
    }
}

int MaiMic(int v[100001], int nr, int lo, int hi)
{
    int poz = CautareBinara(v, nr, lo, hi);
    if (poz == -1)
        return -1;
    else
    {
        while (v[poz - 1] == nr)
            poz--;
        return poz + 1;
    }
}

int main()
{
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");
    int v[100001];
    int n, m, a, b, poz, final;

    f >> n;
    for (int i = 0; i < n; i++)
        f >> v[i];

    f >> m;
    for (int i = 0; i < m; i++)
    {
        f >> a >> b;
        switch(a)
        {
            case 0:
                g << MaiMare(v, b, 0, n) << '\n';
                break;
            case 1:
                poz = 0; final = 0;
                do
                {
                    final = poz;
                    poz = MaiMare(v, b--, 0, n);
                }
                while (poz != -1);
                g << final << '\n';
                break;
            case 2:
                poz = 0; final = 0;
                do
                {
                    final = poz;
                    poz = MaiMic(v, b++, 0, n);
                }
                while (poz != -1);
                g << final << '\n';
                break;
        }
    }
    f.close();
    g.close();

    return 0;
}