Cod sursa(job #2218619)

Utilizator SmitOanea Smit Andrei Smit Data 5 iulie 2018 10:45:12
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#include <iostream>
using namespace std;

int n, a[100000], m;


int caut0(int a[], int n, int x)
{
    int s = 0, d = n-1, mij,poz;
    poz = -1;
    while(s<=d)
    {
        mij = s + (d-s)/2;
        if(x == a[mij])
        {
            poz = mij;
            s = mij+1;
        }
        else
            if(x < a[mij])
                d = mij - 1;
            else
                s = mij + 1;

    }

    return poz;


}



///cea mai mare poz pe care se afla o val mai mica sau egala cu x
///a = (1, 2, 2, 3, 4, 4, 4) x = 4, poz = 7
///a = (1, 1, 1, 3, 3, 5, 7, 8, 9) x = 4, poz = 5

int caut1(int a[], int n, int x)
{
    int s = 0, d = n-1, mijl, poz;
    while(s<=d)
    {
        mijl = s + (d-s)/2;
        if(x >= a[mijl])
        {
            poz = mijl;
            s = mijl+1;
        }
        else
            d = mijl - 1;

    }

    return poz;

}

/// cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir
///a = (1. 2, 3, 3, 3,7, 7, 7) x = 4, poz = 6
///a = (1, 2, 2, 2, 3, 4, 5, 6, 7, 8) x = 2, poz = 2
int caut2(int a[], int n, int x)
{
    int s = 0, d = n-1, mijl, poz;
    while(s<=d)
    {
        mijl = s + (d-s)/2;
        if(a[mijl] < x)
            s = mijl + 1;

        else
        {
            poz = mijl;
            d = mijl - 1;
        }

    }

    return poz;

}
void citire(int a[], int &n)
{
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");
    int  x, op;
    f>>n;
    for(int i=0;i<n;i++)
        f>>a[i];
    f>>m;
    while(f>>op>>x)
    {
        if(op == 0)
            g<<caut0(a, n, x) + 1<<"\n";

        if(op == 1)
            g<<caut1(a, n, x) + 1<<"\n";

        if(op == 2)
            g<<caut2(a, n, x) + 1<<"\n";

    }
}


///cea mai mica poz pe care se afla un elem mai mic sau egal cu x
///2 3 3 3 5 8
///x=4 --> poz=1. mereu este 1





int main()
{

    citire(a,n);
   /*int nr=1;
    ETICHETA1:
    nr++;
    if(nr<=10)
        goto ETICHETA1;

    cout<<nr<<"\n";*/
    ///asa functyioneaza goto
    return 0;
}