Cod sursa(job #1150480)

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

using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n,a[1001],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 x) {
    int p = 1, u = n, mid;
    while (p<=u) {
        mid = (p+u)/2;
        if (x>=a[mid]) {
            p = mid+1;
        } else {
            u = mid-1;
        }
    }
    if (a[u] == x)
        return u;
    else
        return -1;

}
int cautMinim(int x)
{
    int p = 1, u = n, mid;
    while (p<=u) {
        mid = (p+u)/2;
        if (x<=a[mid]) {
            u = mid-1;
        } else {
            p = mid+1;
        }
    }
    if (a[p] == x)
        return p;
    else
        return -1;

}