Cod sursa(job #2337240)

Utilizator FastmateiMatei Mocanu Fastmatei Data 6 februarie 2019 08:41:20
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

int a[100005],n;

///Returneaza cea mai din dreapta pozitie pe care se afla x
///sau returneaza -1 daca x nu apare in vector

int CB0(int x)
{
    if(x>a[n]) return -1;
    if(x<a[1]) return -1;
    int st,dr,mij,poz;
    st=1;
    dr=n;
    poz=-1; ///pozitia cea mai din dreapta unde este x
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(a[mij]==x)
        {
            poz=mij;
            ///caut si mai in dreapta un x
            st=mij+1;
        }
        else if(a[mij]<x) st=mij+1;
        else dr=mij-1;
    }
    return poz;
}

///Returneaza cea mai din dreapta pozitie
///cu a[poz]<=x
int CB1(int x)
{
        if(x<a[1]) return 1;
        if(x>=a[n]) return n;
        int st,dr,mij,poz;
        st=1;
        dr=n;
        poz=-1;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(a[mij]<=x)
            {
                poz=mij;
                st=mij+1;
            }
            else dr=mij-1;
        }
        return poz;
}


int CB2(int x)
{
    if(x<=a[1]) return 1;
    int st,dr,mij,poz;
    st=1;
    dr=n;
    poz=-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(x<=a[mij])
        {
            poz=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    return poz;
}

int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    int i,M,op,x;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>a[i];
    fin>>M;
    for(i=1;i<=M;i++)
    {
        fin>>op>>x;
        if(op==0) fout<<CB0(x)<<"\n";
        else if(op==1) fout<<CB1(x)<<"\n";
        else fout<<CB2(x)<<"\n";
    }
    return 0;
}