Cod sursa(job #2807931)

Utilizator andrei_laurentiuRadu Andrei-Laurentiu andrei_laurentiu Data 24 noiembrie 2021 12:54:26
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

vector <int> v;
int n;

int cautare_binara(int x, int st, int dr)
{
    int mij, ans = -1;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(v[mij] > x)
            dr = mij - 1;
        else
        {
            st = mij + 1;
            if(v[mij] == x)
                ans = mij;
        }
    }
    return ans;
}

int dreapta_maxim_mai_mic_ca_x(int x, int st, int dr)
{
    int mij, ans = 0;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(x < v[mij])
            dr = mij - 1;
        else
        {
            st = mij + 1;
            ans = mij;
        }
    }
    return ans;
}

int stanga_maxim_mai_mare_ca_x(int x, int st, int dr)
{
    int mij, ans = n;
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        if(x > v[mij])
            st = mij + 1;
        else
        {
            dr = mij - 1;
            ans = mij;
        }
    }
    return ans;
}
int main()
{
    int i, x, q, y;
    fin>>n;
    v.push_back(0);
    for(i = 1; i <= n; ++i)
    {
        fin>>x;
        v.push_back(x);
    }

    fin>>q;
    for(i = 1; i <= q; ++i)
    {
        fin>>x>>y;

        switch(x)
        {
        case 0:
            fout<<cautare_binara(y, 1, n);
            break;
        case 1:
            fout<<dreapta_maxim_mai_mic_ca_x(y, 1, n);
            break;
        case 2:
            fout<<stanga_maxim_mai_mare_ca_x(y, 1, n);
            break;
        }
        fout<<'\n';
    }
    return 0;
}