Cod sursa(job #2977979)

Utilizator catalinmarincatalinmarin catalinmarin Data 12 februarie 2023 18:35:16
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.51 kb
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int v[100001], n, i;
int BinarySearch(int vec[], int n, int l, int r, int elem)
{
    if (l > r)
        return -1;
    int mid = l + (r-l)/2;
    if (elem == vec[mid])
    {
        if (mid < n-1 && vec[mid + 1] != elem)
        {
            return mid;
        }
        else if (mid < n - 1 && vec[mid + 1] == elem)
        {
            return BinarySearch(vec,n, mid + 1, r, elem);
        }
        return BinarySearch(vec,n, l, mid - 1, elem);
    }
    if (elem < vec[mid]) return BinarySearch(vec,n, l, mid - 1, elem);
    return BinarySearch(vec,n, mid + 1, r, elem);
}
int BinarySearch1(int vec[], int n, int l, int r, int elem)
{
    if (l > r)
        return l;
    int mid = l + (r-l)/2;
    if (elem == vec[mid])
    {
        if (mid < n-1 && vec[mid + 1] != elem)
        {
            return mid;
        }
        else if (mid < n - 1 && vec[mid + 1] == elem)
        {
            return BinarySearch1(vec,n, mid + 1, r, elem);
        }
        return BinarySearch1(vec,n, l, mid - 1, elem);
    }
    if (elem < vec[mid]) return BinarySearch1(vec,n, l, mid - 1, elem);
    return BinarySearch1(vec,n, mid + 1, r, elem);
}
int BinarySearch2(int vec[], int n, int l, int r, int elem)
{
    if (l > r)
        return l;
    int mid = l + (r-l)/2;
    if (elem == vec[mid])
    {
        if (mid > 0 && vec[mid - 1] != elem)
        {
            return mid;
        }
        else if (mid > 0 && vec[mid - 1] == elem)
        {
            return BinarySearch2(vec,n, l, mid - 1, elem);
        }
        return BinarySearch2(vec,n, mid + 1, r, elem);
    }
    if (elem < vec[mid]) return BinarySearch2(vec,n, l, mid - 1, elem);
    return BinarySearch2(vec,n, mid + 1, r, elem);
}
int main(){
    int TipIntrebare, NrIntrebari, NrDeVerificat, PozNrVerificat;
    fin >> n;
    for (i = 0; i<n; i++)
        fin >> v[i];
    fin >> NrIntrebari;
    for (i = 1; i <= NrIntrebari; i++){
        fin >> TipIntrebare >> NrDeVerificat;
        if (TipIntrebare == 0){
            PozNrVerificat = BinarySearch(v, n, 0, n-1, NrDeVerificat);
            if (PozNrVerificat == -1)
                fout << PozNrVerificat << '\n';
            else
                fout << PozNrVerificat+1 << '\n';
        }
        else if (TipIntrebare == 1){
            fout << BinarySearch1(v, n, 0, n-1, NrDeVerificat)+1 << '\n';
        } else if (TipIntrebare == 2){
            fout << BinarySearch2(v, n, 0, n-1, NrDeVerificat)+1 << '\n';
        }
    }
    return 0;
}