Cod sursa(job #3348537)

Utilizator IzabelaJePloscaru Maria Izabela IzabelaJe Data 22 martie 2026 15:28:15
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.78 kb
/**
Se da un sir de numere ordonat crescator cu N elemente, si se cere sa se raspunda la M intrebari de tipul:
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
Date de intrare
Pe prima linie a fisierului de intrare cautbin.in se afla numarul N reprezentand numarul de elemente ale sirului. Pe urmatoarea linie se gasesc N numere reprezentand elementele sirului. Linia a treia contine numarul M reprezentand numarul de intrebari. Apoi urmeaza M linii, fiecare cu unul dintre cele 3 tipuri de intrebari.

Date de iesire
In fisierul de iesire cautbin.out se vor afisa M linii reprezentand raspunsul la cele M intrebari.

Restrictii
1 ≤ N ≤ 100 000
1 ≤ M ≤ 100 000
Elementele sirului vor fi numere strict pozitive si se vor incadra pe 31 de biti
**/
#include <iostream>
#include <fstream>
using namespace std;
int v[100001],n,m,x,st,dr,ap,mid;
char op;
int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    fin>>n;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    fin>>m;
    for(int i=1;i<=m;i++){
        fin>>op>>x;
        if(op=='0'){
            ap=-1;
            st=1,dr=n;
            while(st<=dr){
                mid=(st+dr)/2;
                if(v[mid]==x){
                    ap=mid;
                    st++;
                }
                else
                    if(x<v[mid])
                        dr=mid-1;
                    else
                        st=mid+1;
            }
            fout<<ap<<endl;
        }
        if(op=='1'){
            ap=-1;
            st=1,dr=n;
            while(st<=dr){
                mid=(st+dr)/2;
                if(v[mid]<=x){
                    ap=mid;
                    st++;
                }
                else
                    if(x<v[mid])
                        dr=mid-1;
                    else
                        st=mid+1;
            }
            fout<<ap<<endl;
        }
        if(op=='2'){
            ap=-1;
            st=1,dr=n;
            while(st<=dr){
                mid=(st+dr)/2;
                if(v[mid]>=x){
                    ap=mid;
                    dr--;
                }
                else
                    if(x<v[mid])
                        dr=mid-1;
                    else
                        st=mid+1;
            }
            fout<<ap<<endl;
        }
    }

    return 0;
}