Cod sursa(job #2265562)

Utilizator daru06Daria Culac daru06 Data 21 octombrie 2018 14:10:42
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>

using namespace std;
ifstream fi("cautbin.in");
ofstream fo("cautbin.out");
int N,A[100001];
int M;

int bs1(int st,int dr, int x)
{
    if (st==dr)
        if (A[st]==x)
            return st;
        else
            return -1;
    int m;
    m=(st+dr+1)/2;
    if (A[m]<=x)
        return bs1(m,dr,x);
    else
        return bs1(st,m-1,x);
}

int bs2(int st,int dr, int x)
{
    if (st==dr)
        if (A[st]<=x)
            return st;
        else
            return -1;
    int m;
    m=(st+dr+1)/2;
    if (A[m]<=x)
        return bs2(m,dr,x);
    else
        return bs2(st,m-1,x);
}

int bs3(int st,int dr, int x)
{
    if (st==dr)
        if (A[st]>=x)
            return st;
        else
            return -1;
    int m;
    m=(st+dr)/2;
    if (A[m]>=x)
        return bs3(st,m,x);
    else
        return bs3(m+1,dr,x);
}

int main()
{
    fi>>N;
    for (int i=1;i<=N;i++)
        fi>>A[i];
    fi>>M;
    for (int test=1;test<=M;test++)
    {
        int tip;
        fi>>tip;
        if (tip==0)
        {
            int x;
            fi>>x;
            /// ultima aparitie a lui x in sirul A
            /// -1 daca nu apare
            fo<<bs1(1,N,x)<<"\n";
            continue;
        }
        if (tip==1)
        {
            int x;
            fi>>x;
            /// ultima aparitie din sirul A unde se afla
            /// o valoare mai mica sau egala cu x
            fo<<bs2(1,N,x)<<"\n";
            continue;
        }
        if (tip==2)
        {
            int x;
            fi>>x;
            /// cea mai dinspre stanga pozitie din A unde se afla
            /// o valoare mai mare sau egala cu x
            fo<<bs3(1,N,x)<<"\n";
            continue;
        }
    }
    fi.close();
    fo.close();
    return 0;
}