Cod sursa(job #2830019)

Utilizator divadddDavid Curca divaddd Data 9 ianuarie 2022 13:08:02
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#define MAX 100002
using namespace std;
int n,m,v[MAX],t,x;

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

int cautareb0(int x){
    /// cea mai mare pozitie pe care se afla un element cu valoarea x sau -1
    /// daca aceasta valoare nu se gaseste in sir
    int mid,st = 1, dr = n;
    while(st <= dr){
        mid = (st+dr)/2;
        if(v[mid] <= x){
            st = mid+1;
        }else{
            dr = mid-1;
        }
    }
    mid = (st+dr)/2;
    if(v[mid] > x){
        mid--;
    }
    if(v[mid] == x){
        return mid;
    }
    return -1;
}

int cautareb1(int 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
    int mid,st = 1, dr = n;
    while(st < dr){
        mid = (st+dr)/2;
        if(v[mid] <= x){
            st = mid+1;
        }else{
            dr = mid;
        }
    }
    mid = (st+dr)/2;
    if(v[mid] > x){
        mid--;
    }
    return mid;
}

int cautareb2(int 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
    int mid,st = 1, dr = n;
    while(st < dr){
        mid = (st+dr)/2;
        if(v[mid] < x){
            st = mid+1;
        }else{
            dr = mid;
        }
    }
    mid = (st+dr)/2;
    if(v[mid] < x){
        ++mid;
    }
    return mid;
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
    fin >> m;
    for(int i = 1; i <= m; i++){
        fin >> t >> x;
        if(t == 0){
            fout << cautareb0(x) << "\n";
        }else if(t == 1){
            fout << cautareb1(x) << "\n";
        }else if(t == 2){
            fout << cautareb2(x) << "\n";
        }
    }
    return 0;
}