Cod sursa(job #1010289)

Utilizator c0rn1Goran Cornel c0rn1 Data 14 octombrie 2013 17:59:49
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("cautbin.in");
ofstream fout ("cautbin.out");

int n, a[100001], t, op, nr;

void citire()
{
    fin>>n;
    for (int i=1; i<=n; i++)
        fin>>a[i];
    fin>>t;
}

void op0(int st, int dr, int val)
{
    int mij;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (a[mij]>val)
            dr=mij-1;
        else if (a[mij]<val)
            st=mij+1;
        else if (a[mij]==val)
        {
            while(a[mij]==val && mij<=dr)
                mij++;
            if (mij>dr+1)
                fout<<"-1";
            else
                fout<<mij-1;
            fout<<"\n";
            return;
        }
    }
    fout<<"-1\n";
}

void op1(int st, int dr, int val)
{
    int mij;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (a[mij]>val)
            dr=mij-1;
        else
        {
            while(a[mij]<=val && mij<=dr)
                mij++;
            fout<<mij-1<<"\n";
            return;
        }
    }
}

void op2(int st, int dr, int val)
{
    int mij;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (a[mij]<val)
            st=mij+1;
        else
        {
            while (a[mij]>=val && mij>=st)
                mij--;
            fout<<mij+1<<"\n";
            return;
        }
    }
}

int main()
{
    citire();
    for (int i=0; i<t; i++)
    {
        fin>>op>>nr;
        switch(op)
        {
            case 0: op0(1, n, nr);
                break;
            case 1: op1(1, n, nr);
                break;
            case 2: op2(1, n, nr);
                break;
            default: fout<<"error";
                break;
        }
    }
    return 0;
}