Cod sursa(job #1680622)

Utilizator Cosmin_NTGIonita Cosmin Cosmin_NTG Data 8 aprilie 2016 22:08:15
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#include <iostream>
#include<fstream>

using namespace std;

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

int binary_s_0(int v[], int left, int right, int el)
{
    if(right < left)
        return -1;

    int mid = left + (right - left) / 2;

    if(v[mid] == el && v[mid + 1] > el)
        return mid;
    else
        return binary_s_0(v, mid + 1, right, el);

    if(v[mid] < el)
        return binary_s_0(v, mid + 1, right, el);
    else
        return binary_s_0(v, left, mid - 1, el);
}

int binary_s_1(int v[], int left, int right, int el)
{
    int mid = left + (right - left) / 2;

    if(v[mid] < el && v[mid + 1] > el)
        return mid;
    //else
        //return binary_s_1(v, left, mid, el);

    if(v[mid] < el)
        return binary_s_1(v, mid + 1, right, el);
    else
        return binary_s_1(v, left, mid - 1, el);
}

void handle_1_command(int v[], int n, int el)
{
    int x = binary_s_0(v, 0, n, el);

    if(x != -1)
        g<<x + 1<<"\n";
    else
        g<<binary_s_1(v, 0, n, el) + 1<<"\n";
}

int binary_s_2(int v[], int left, int right, int el)
{
    int mid = left + (right - left) / 2;

    if(v[mid] > el && v[mid + 1] < el)
        return mid;

    if(v[mid] < el)
        return binary_s_2(v, mid + 1, right, el);
    else
        return binary_s_2(v, left, mid - 1, el);
}


int binary_s_3(int v[], int left, int right, int el)
{
    if(right < left)
        return -1;

    int mid = left + (right - left) / 2;

    if(v[mid] < el && v[mid + 1] == el)
        return mid + 1;
    else
        return binary_s_3(v, left, mid - 1, el);

    if(v[mid] < el)
        return binary_s_3(v, mid + 1, right, el);
    else
        return binary_s_3(v, left, mid - 1, el);
}

void handle_2_command(int v[], int n, int el)
{
    int x = binary_s_3(v, 0, n, el);

    if(x != -1)
        g<<x + 1<<"\n";
    else
        g<<binary_s_2(v, 0, n, el) + 1<<"\n";
}

int main()
{
    int N, M, comm, x;

    f>>N;

    int *v = new int[N];

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

    f>>M;

    for(int i = 0; i<M; i++)
    {
        f>>comm;
        f>>x;

        if(comm == 0)
            g<<(binary_s_0(v, 0, N - 1, x) + 1)<<"\n";
        if(comm == 1)
            handle_1_command(v, N - 1, x);
        if(comm == 2)
            handle_2_command(v, N - 1, x);
    }

    f.close();
    g.close();

    return 0;
}