Cod sursa(job #2056303)

Utilizator TC14Damsa Ioan Dinu TC14 Data 4 noiembrie 2017 10:46:32
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>

using namespace std;

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

int cauta (int n, int v[], int st, int dr, int x)
{
    if (st>dr)
        return -1;
    int mij=st+(dr-st)/2;
    if (v[mij]==x)
        return mij;
    if (v[mij]<x)
        return cauta (n,v,mij+1,dr,x);
    return cauta(n,v,st,mij-1,x);
}

void cautaa (int n, int v[], int st, int dr, int x, int &ma)
{
    int mij;
    ma=-1;
    while (st<=dr)
    {
        mij=st+(dr-st)/2;
        if (v[mij]==x)
        {
            ma=mij;
            mij++;
            while (v[mij]==x)
                mij++;
            ma=mij;
            break;
        }
        else if (v[mij]<x)
            st=mij+1;
        else
            dr=mij-1;
    }
}

void cauta_min (int n, int v[], int st, int dr, int x, int &ma)
{
    int mij;
    ma=-1;
    while (st<=dr)
    {
        mij=st+(dr-st)/2;
        if (v[mij]==x)
        {
            ma=mij;
            mij--;
            while (v[mij]==x)
                mij--;
            ma=mij+2;
            break;
        }
        else if (v[mij]<x)
            st=mij+1;
        else
            dr=mij-1;
    }
}

void c0 (int n, int v[], int val)
{
    int ma;
    cautaa(n,v,0,n-1,val,ma);
    g<<ma<<'\n';
}

void c1 (int n, int v[], int val)
{
    int ma;
    cautaa(n,v,0,n-1,val,ma);
    while (ma==-1)
    {
        val--;
        cautaa(n,v,0,n-1,val,ma);
    }
    g<<ma<<'\n';
}

void c2 (int n, int v[], int val)
{
    int ma;
    cauta_min(n,v,0,n-1,val,ma);
    while (ma==-1)
    {
        val++;
        cauta_min(n,v,0,n-1,val,ma);
    }
    g<<ma<<'\n';
}

int n,m,v[100001];
int main()
{
    int i,val,caz;
    f>>n;
    for (i=0; i<n; i++)
        f>>v[i];
    f>>m;
    for (i=1; i<=m; i++)
    {
        f>>caz>>val;
        switch (caz)
        {
        case 0:
            c0(n,v,val);
            break;
        case 1:
            c1(n,v,val);
            break;
        default:
            c2(n,v,val);
        }
    }
    return 0;
}