Cod sursa(job #1161938)

Utilizator dumitrualexAlex Dumitru dumitrualex Data 31 martie 2014 15:42:19
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#define nmax 100000+5
using namespace std;

int v[nmax];
int n, m;

ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

int cautare0(int x)
{
    int st = 1, dr = n;
    int mijl;
    while (st <= dr)
    {
        m = (st + dr) / 2;
        if (v[m] == x)
        {
            while (m+1 <= n && v[m+1] == x)
                m++;
            return m;
        }
        else if (v[m] > x)
            st = m;
        else
            dr = m;
    }
    return -1;
}

int cautare1(int x)
{
    int st = 1, dr = n;
    int mijl;

    while (st <= dr)
    {
        m = (st + dr) / 2;
        if (v[m] == x)
            break;
        else if (v[m] > x)
            st = m;
        else
            dr = m;
    }
    while (m+1 <= n && v[m+1] <= x)
        m++;
    return m;
}

int cautare2(int x)
{
    int st = 1, dr = n;
    int mijl;

    while (st <= dr)
    {
        m = (st + dr) / 2;
        if (v[m] == x)
            break;
        else if (v[m] > x)
            st = m;
        else
            dr = m;
    }

    while (m-1 > 0 && v[m-1] >= x)
        m--;
    return m;
}

int main()
{
    int i, j;
    int a, b;

    fin >> n;
    for (i = 1; i <= n; i++)
        fin >> v[i];

    fin >> m;
    for (j = 1; j <= m; j++)
    {
        fin >> a >> b;
        if (a == 0)
            fout << cautare0(b);
        else if (a == 1)
            fout << cautare1(b);
        else if (a == 2)
            fout << cautare2(b);
        fout << '\n';
    }

    return 0;
}