Cod sursa(job #3311447)

Utilizator domdiridomdidomDominik domdiridomdidom Data 22 septembrie 2025 14:41:36
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>

void binKer(int k, int szam, int * tomb, int bal, int jobb, int &megtalalt){
    if(bal > jobb)
        return;
    int kozep = (bal + jobb) / 2;
        
    // tomb[kozep] = szam
    // tomb[kozep - 1] <= tomb[kozep] < tomb[kozep + 1]
    if(k == 0){
        if(tomb[kozep] == szam){
            megtalalt = kozep;
            return binKer(k, szam, tomb, kozep + 1, jobb, megtalalt);
        }
        if(tomb[kozep] > szam)
            return binKer(k, szam, tomb, bal, kozep - 1, megtalalt);
        if(tomb[kozep] < szam)
            return binKer(k, szam, tomb, kozep + 1, jobb, megtalalt);
    }
    // tomb[kozep] <= szam < tomb[kozep + 1] 
    if(k == 1){
        if(tomb[kozep] > szam)
            return binKer(k, szam, tomb, bal, kozep - 1, megtalalt);
        if(tomb[kozep] <= szam){
            megtalalt = kozep;
            return binKer(k, szam, tomb, kozep + 1, jobb, megtalalt);
        }
        return;
    }
    // tomb[kozep - 1] < szam <= tomb[kozep]
    if(k == 2){
        if(tomb[kozep] >= szam){
            megtalalt = kozep;
            return binKer(k, szam, tomb, bal, kozep - 1, megtalalt);
        }
        if(tomb[kozep] < szam)
            return binKer(k, szam, tomb, kozep + 1, jobb, megtalalt);
        return;
    }
    return;
}

int main(){
    std::ifstream bem("cautbin.in");
    std::ofstream kim("cautbin.out");
    int n, m;
    bem >> n;
    int * tomb = new int[n];
    for(int i = 0; i < n; i++)  bem >> tomb[i];
    bem >> m;
    
    for(int i = 0; i < m; i++){
        int k, szam, megtalalt = -1;
        bem >> k >> szam;
        binKer(k, szam, tomb, 0, n - 1, megtalalt);
        if(megtalalt == -1)
            kim << -1 << ' ';
        else
            kim << megtalalt + 1 << ' ';
    }
}