Cod sursa(job #1557384)

Utilizator jordasIordache Andrei Alexandru jordas Data 27 decembrie 2015 13:50:15
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
/*
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
*/

#define nMax 100001
#include <fstream>

using namespace std;

 ifstream x ("cautbin.in");
 ofstream y ("cautbin.out");

 int b;   //b=x
 int n,m;
 int v[nMax];

 int case_0(int i, int j)
 {
     int k=(i+j)/2;

     if(v[k]==b)
        if(v[k+1]!=b)
            return k;
        else
            return case_0(k,j);

     if(i==j)
        return -1;

     if(v[k]>b)
        return case_0(i,k);
     else
        return case_0(k,j);
 }

 int case_1(int i, int j)
 {
     int k=(i+j)/2;

     if(v[k]==b)
        if(v[k+1]!=b)
            return k;
        else
            return case_1(k,j);
     else
        if(v[k]<=b)
            return case_1(i,k);
        else
            return case_1(k,j);
 }

 int case_2(int i, int j)
 {
     int k=(i+j)/2;

     if(v[k]==b)
        if(v[k-1]!=b)
            return k;
        else
            return case_2(i,k);
     else
        if(v[k]<b)
            return case_2(k,j);
        else
            return case_2(i,k);
 }

int main()
{
    x>>n;

    for(int i=1;i<=n;i++)
        x>>v[i];

    x>>m;

    int a;

    for(int i=0;i<m;i++)
    {
        x>>a;
        x>>b;

        switch(a)
        {
            case 0:
                y<<case_0(1,n)<<'\n';
                break;
            case 1:
                y<<case_1(1,n)<<'\n';
                break;
            case 2:
                y<<case_2(1,n)<<'\n';
                break;
        }
    }

    return 0;
}