Cod sursa(job #2875178)

Utilizator Tudose_StefanTudose Alexandru Stefan Tudose_Stefan Data 21 martie 2022 10:45:42
Problema Cautare binara Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <vector>

using namespace std;

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

int lung, i, nrtaskuri, task, pozcaut;

int caut1(vector<int> & sir, int pozcaut)
{
    int st = 0, dr = sir.size()-2;
    while (st<=dr)
    {
        int mijloc = st + (dr-st)/2;
        if (sir[mijloc] == pozcaut)
        {
            if (sir[mijloc+1] != pozcaut)
                return mijloc+1;
            else
                st = mijloc+1;
        }
        else if (sir[mijloc] < pozcaut)
            st = mijloc+1;
        else if (sir[mijloc] > pozcaut)
            dr = mijloc-1;
    }
    return -1;
}

int caut2(vector <int> & sir, int pozcaut)
{
    int st = 0, dr = sir.size()-2;
    while (st <= dr)
    {
        int mijloc = st +(dr-st)/2;
        if (sir[mijloc] <= pozcaut)
        {
            if (sir[mijloc+1] > pozcaut || sir[mijloc+1] == -1)
                return mijloc+1;
            else
                st = mijloc+1;
        }
        else
            dr = mijloc-1;
    }
}


int caut3(vector <int> & sir, int pozcaut)
{
    int st = 0, dr = sir.size()-2;
    while (st <= dr)
    {
        int mijloc = st +(dr-st)/2;
        if (sir[mijloc] >=pozcaut)
        {
            if (mijloc == 0)
                return 0;
            if (sir[mijloc-1] < pozcaut)
                return mijloc+1;
            else
                dr = mijloc-1;
        }
        else
            st = mijloc+1;
    }
}



int main()
{
    fin >> lung;
    vector <int> sir;
    sir.assign(lung+1, -1);
    for (i = 0; i< lung; i++)
        fin >> sir[i];
    fin >> nrtaskuri;
    while (nrtaskuri)
    {
        fin >> task >> pozcaut;
        switch (task)
        {
        case 0:
            fout << caut1(sir, pozcaut) << '\n';
            break;
        case 1:
            fout << caut2(sir, pozcaut) << '\n';
            break;
        case 2:
            fout << caut3(sir, pozcaut) << '\n';
            break;
        }
        nrtaskuri--;
    }
    return 0;
}