Cod sursa(job #2811527)

Utilizator nushLaura Maria nush Data 2 decembrie 2021 14:45:45
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.99 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int i,a[100010],ics,apel;
long long n,m;
int divide_et_impera0(int left,int right,int x)
{
    int mij;
    if(left<=n && right>-1)
    {
        mij=(left+right)/2;
        if(a[mij]==x)
        {
            if(a[mij+1]!=x)
                return mij;
            else
                return divide_et_impera0(mij+1,right,x);
        }
        if(a[mij]>x)
        {
            return divide_et_impera0(left,mij-1,x);
        }
        if(a[mij]<x)
        {
            if(a[mij+1]>x)
                return -1;
            else
                return divide_et_impera0(mij+1,right,x);
        }
    }
}
int divide_et_impera1(int left,int right,int x)
{
    int mij;
    if(left<=n && right>-1)
    {
        mij=(left+right)/2;
        if(a[mij]<=x)
        {
            if(a[mij+1]>x)
                return mij;
            else
                return divide_et_impera1(mij+1,right,x);
        }
        if(a[mij]>x)
        {
            return divide_et_impera1(left,mij-1,x);
        }
    }
}
int divide_et_impera2(int left,int right,int x)
{
    int mij;
    if(left<=n && right>-1)
    {
        mij=(left+right)/2;
        if(a[mij]==x)
        {
            if(a[mij-1]!=x)
            {
                return mij;
            }

            else
                return divide_et_impera2(left,mij-1,x);
        }
        if(a[mij]>x)
        {
            if(a[mij]==a[right])
                if(a[mij-1]!=a[mij])
                    if(a[right]>x)
                    {
                        return mij;
                    }

                    else
                        return -1;
                else
                    return divide_et_impera2(left,mij-1,x);
            else
                return divide_et_impera2(mij+1,right,x);


            return divide_et_impera2(left,mij-1,x);
        }
        if(a[mij]<x)
        {
            return divide_et_impera2(mij+1,right,x);
        }
    }
}


int main()
{
    f>>n;
    for(i=0; i<n; i++)
    {
        f>>a[i];
    }
    f>>m;
    for(i=0; i<m; i++)
    {
        f>>apel>>ics;
        if(apel==0)
            g<<divide_et_impera0(0,n-1,ics)+1<<"\n";
        if(apel==1)
            g<<divide_et_impera1(0,n-1,ics)+1<<"\n";
        if(apel==2)
            g<<divide_et_impera2(0,n-1,ics)+1;
    }


    return 0;
}
/*
Cerinta:
https://www.infoarena.ro/problema/cautbin
Solutie1
Avem o functie divide_et_impera pe care o apelam cu right si left;
Intrand in functie calculam mijlocul array-ului.
Apoi comparam val din mijl cu elem cautat:
Daca valoarea din mijl este mai mica sau egala cu elem cautat,
        daca valoarea din [mij+1] este mai mare decat elem cautat => atunci mij este solutia.
        else apelam functia cu left=mij+1 si right=right.
Else apelam functia left=left si right=mij-1;
*/
///complexitate:O(log2(n))