Cod sursa(job #1238609)

Utilizator MarronMarron Marron Data 7 octombrie 2014 12:07:23
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 100005
#define INF 0x3f3f3f3f

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

int n;
int a[MAXN];

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

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

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

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

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

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

    return -1;
}

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

    while (st <= dr)
    {

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

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

    return -1;
}

int main()
{
    f >> n;
    for (int i = 1; i <= n; i++)
    {
        f >> a[i];
    }
    a[n + 1] = INF;

    int m;
    f >> m;
    for (int i = 1; i <= m; i++)
    {
        int op, x;
        f >> op >> x;

        if (op == 0) g << caut0(x) << '\n';
        if (op == 1) g << caut1(x) << '\n';
        if (op == 2) g << caut2(x) << '\n';
    }

    f.close();
    g.close();
    return 0;
}