Cod sursa(job #2056321)

Utilizator TC14Damsa Ioan Dinu TC14 Data 4 noiembrie 2017 10:59:30
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 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)
            st=mij+1;
        else
            dr=mij-1;
    }
    mij=(st+dr)/2;
    if (v[mij]>x)
        mij--;
    ma=mij;
}

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)
            st=mij+1;
        else
            dr=mij-1;
    }
    mij=(st+dr)/2;
    if (v[mij]<x)
        mij++;
    ma=mij;
}

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

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

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

int n,m,v[100010];
int main()
{
    int i,val,caz;
    f>>n;
    for (i=1; 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;
}