Cod sursa(job #1963087)

Utilizator ioanavasilescuIoana Vasilescu ioanavasilescu Data 12 aprilie 2017 11:50:02
Problema Cautare binara Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>

using namespace std;

int a[100010],n;

int caut_bin0(int x)
{
    int st,dr,mijl;
    st=0;dr=n;
    bool gasit=0;
    while(st<=dr&&!gasit)
    {
        mijl=st+(dr-st)/2;
        if(a[mijl]>x)dr=mijl-1;
        else st=mijl+1;
        if(a[mijl]==x)gasit=1;
    }
    if(gasit)
    {
        while(a[mijl+1]==x)mijl++;
        return mijl;
    }
    return -1;
}

int caut_bin1(int x)
{
    int st,dr,mijl;
    st=0;dr=n;
    bool gasit=0;
    while(st<=dr&&!gasit)
    {
        mijl=st+(dr-st)/2;
        if(a[mijl]>x)dr=mijl-1;
        else st=mijl+1;
        if(a[mijl]==x)gasit=1;
    }
    if(gasit)
    {
        while(a[mijl+1]==x)mijl++;
        return mijl;
    }
    mijl--;
    while(a[mijl+1]<x&&mijl<n)mijl++;
    return mijl;
}

int caut_bin2(int x)
{
    int st,dr,mijl;
    st=0;dr=n;
    bool gasit=0;
    while(st<=dr&&!gasit)
    {
        mijl=st+(dr-st)/2;
        if(a[mijl]>x)dr=mijl-1;
        else st=mijl+1;
        if(a[mijl]==x)gasit=1;
    }
    if(gasit) return mijl;
    mijl++;
    while(a[mijl-1]>x&&mijl>1)mijl--;
    return mijl;
}

int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    int m,i,x,cer;
    fin>>n;
    for(i=1;i<=n;i++)
        fin>>a[i];
    fin>>m;
    for(i=1;i<=m;i++)
    {
        fin>>cer>>x;
        if(!cer) fout<<caut_bin0(x);
        else if(cer==1) fout<<caut_bin1(x);
        else fout<<caut_bin2(x);
        fout<<"\n";
    }
    return 0;
}