Cod sursa(job #1807804)

Utilizator EvohuntAndrei Dana Evohunt Data 16 noiembrie 2016 22:13:45
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>

using namespace std;

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

int cautare_binara_01(int v[], int n, int x) {

    int mid, found = 0;
    int st = 1;
    int dr = n;

    while (st <= dr && !found) {
        mid = (st + dr) / 2;

        if (x == v[mid]) {
            if (x == v[mid + 1])
                st = mid + 1;
            else
                return mid;
        }
        else
            if (x < v[mid])
                dr = mid - 1;
            else
                st = mid + 1;
    }

}

int cautare_binara_02(int v[], int n, int x) {

    int mid, found = 0;
    int st = 1;
    int dr = n;

    while (x > v[dr])
        x--;

    while (st <= dr && !found) {
        mid = (st + dr) / 2;

        if (x == v[mid]) {
            if (x == v[mid + 1])
                st = mid + 1;
            else
                return mid;
        }
        else
            if (x < v[mid])
                dr = mid - 1;
            else
                st = mid + 1;
    }

}

int cautare_binara_03(int v[], int n, int x) {

    int mid, found = 0;
    int st = 1;
    int dr = n;

    if (x < v[st])
        x++;

    while (st <= dr && !found) {
        mid = (st + dr) / 2;

        if (x == v[mid]) {
            if (x == v[mid - 1])
                dr = mid - 1;
            else
                return mid;
        }
        else
            if (x < v[mid])
                dr = mid - 1;
            else
                st = mid + 1;
    }

}

int N, a, x;
int qType, nQ;
int v[100010];

int main()
{
    fin >> N;

    for (int i = 1; i <= N; i++) {
        fin >> a;
        v[i] = a;
    }

    fin >> nQ;

    for (int i = 1; i <= nQ; i++) {
        fin >> qType >> x;

        switch (qType) {
            case 0:
                fout << cautare_binara_01(v, N, x) << '\n';
                break;
            case 1:
                fout << cautare_binara_02(v, N, x) << '\n';
                break;
            case 2:
                fout << cautare_binara_03(v, N, x) << '\n';
                break;
        }
    }

    return 0;
}