Cod sursa(job #1261197)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 12 noiembrie 2014 01:16:43
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
int v[NMAX+5], n, i, nr, q, m;
int bs1mare (int st,int dr, int a)
{   int med,last=-1;
    // cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
    while (st<=dr)
    {
        med=(st+dr)>>1;//med=(dr+st)/2;
        if (a==v[med]&&v[med+1]!=a)
            return med;
        else if (a>=v[med])
            st=med+1;
        else
            dr=med-1;
    }
    return last;
}
int bs1mares (int st,int dr, int a)
{   int med,last=-1;
    while (st<=dr)
    {
        med=(st+dr)>>1;//med=(dr+st)/2;
        if (a<v[med]&&v[med-1]<a&&med>st||a<v[med]&&med==st)
            return med;
        else if (a>v[med])
            st=med+1;
        else
            dr=med-1;
    }
    return last;
}
int bs1mic (int st,int dr, int a)
{   int med,last=-1;
    while (st<=dr)
    {
        med=(st+dr)>>1;//med=(dr+st)/2;
        if (a==v[med]&&v[med-1]!=a)
            return med;
        else if (a<=v[med])
            dr=med-1;
        else
            st=med+1;
    }
    return last;
}
int bs1mics (int st,int dr, int a)
{   int med,last=-1;
    //invers mai sus
    while (st<=dr)
    {
        med=(st+dr)>>1;//med=(dr+st)/2;
        if (a>v[med]&&v[med+1]>a&&med<dr||a>v[med]&&med==dr)
            return med;
        else if (a<v[med])
            dr=med-1;
        else
            st=med+1;
    }
    return last;
}
int main()
{   ifstream cin("cautbin.in");
    ofstream cout("cautbin.out");
    cin>>n;
    for (i=1; i<=n; i++)
        cin>>v[i];
    cin>>m;
    for (i=1; i<=m; i++)
    {
        cin>>q>>nr;
        if(q==0)cout<<bs1mare(1,n,nr)<<'\n';
        else if(q==1)
        {
            if(bs1mare(1,n,nr)!=-1)cout<<bs1mare(1,n,nr)<<'\n';
            else cout<<bs1mics(1,n,nr)<<'\n';
        }
        else if(q==2)if(bs1mic(1,n,nr)!=-1)cout<<bs1mic(1,n,nr)<<'\n';
            else cout<<bs1mares(1,n,nr)<<'\n';
    }
    return 0;
}