Cod sursa(job #1150478)

Utilizator cristina_borzaCristina Borza cristina_borza Data 23 martie 2014 09:01:34
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>

using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n,a[100001],i,ex,v,m;
int CautMaxN(int v);
int CautMaxim(int v);
int CautMinim(int v);
int main()
{
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>a[i];
    fin>>m;
    for(i=1;i<=m;i++)
    {
        fin>>ex>>v;
        if(ex==0)
        {
            fout<<CautMaxN(v)<<'\n';
        }
        if(ex==1)
        {
            fout<<CautMaxim(v)<<'\n';
        }
        if(ex==2)
        {
            fout<<CautMinim(v)<<'\n';
        }
    }
}
int CautMaxN(int v)
{
    int i,x=-1,inc=1,sf=n,mij;
    while(sf>=inc)
    {
        mij=(sf+inc)/2;
        if(v==a[mij])
        {
            x=mij;
            break;
        }
        else
        {
            if(v<a[mij])
                sf=mij-1;
            else
                inc=mij+1;
        }
    }
    if(x==-1)
        return -1;
    else
        for(i=x;i<=n;i++)
            if(a[i]!=a[x])
            {
                return i-1;
            }
}
int CautMaxim(int v)
{
    int i,x=-1,inc=1,sf=n,mij;
    while(sf>=inc)
    {
        mij=(sf+inc)/2;
        if(v<=a[mij])
        {
            x=mij;
            break;
        }
        else
            inc=mij+1;
    }
    if(x==-1)
        return -1;
    else
        for(i=x;i<=n;i++)
            if(a[i]>a[x])
            {
                return i-1;
            }
    return 0;
}
int CautMinim(int v)
{
    int i,x=-1,inc=1,sf=n,mij;
    while(sf>=inc)
    {
        mij=(sf+inc)/2;
        if(v>=a[mij])
        {
            x=mij;
            break;
        }
        else
            sf=mij+1;
    }
    if(x==-1)
        return -1;
    else
        for(i=x;i>=1;i--)
            if(a[i]<a[x])
            {
                return i+1;
            }
    return 0;
}