Cod sursa(job #1036910)

Utilizator vasandANDREI POP vasand Data 19 noiembrie 2013 18:54:57
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
# include <iostream>
# include <fstream>
# define nmax 100000
using namespace std;

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

int v[nmax],n,m;

void caut0(int st, int dr, int x)
{
    int mij=(st+dr)/2;
    if(v[mij]==x)
    {
        while(v[mij+1]==x)
            mij+=1;
        g<<mij<<'\n';
        return;
    }
    if(st>=dr)
    {
        g<<"-1"<<'\n';
        return;
    }
    if(x<v[mij])
        return caut0(st, mij-1, x);
    else
        return caut0(mij+1, dr, x);
}

void caut1(int st, int dr, int x)
{
    int mij=(st+dr)/2;
    if(v[mij]==x)
    {
        while(v[mij+1]==x)
            mij+=1;
        g<<mij<<'\n';
        return;
    }
    if(st>=dr)
    {
        if(v[st]<=x)
            g<<st<<'\n';
        else
            g<<st-1<<'\n';
        return;
    }
    if(x<v[mij])
        return caut1(st, mij, x);
    else
        return caut1(mij+1, dr, x);
}

void caut2(int st, int dr, int x)
{
    int mij=(st+dr)/2;
    if(v[mij]==x)
    {
        while(v[mij-1]==x)
            mij-=1;
        g<<mij<<'\n';
        return;
    }
    if(st>=dr)
    {
        g<<st<<'\n';
        return;
    }
    if(x<v[mij])
        return caut2(st, mij, x);
    else
        return caut2(mij+1, dr, x);
}


int main()
{
    int i;
    f>>n;
    for(i=1; i<=n; i++)
        f>>v[i];

    f>>m;
    int caz,x;
    for(i=1; i<=m; i++)
    {
        f>>caz>>x;
        switch(caz)
        {
            case 0:
            {
                caut0(1,n,x);
                break;
            }
            case 1:
            {
                caut1(1,n,x);
                break;
            }
            case 2:
            {
                caut2(1,n,x);
                break;
            }
        }
    }

    return 0;
}