Cod sursa(job #2682138)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 7 decembrie 2020 21:20:43
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

long long cautare(long long x, long long v[], int ps, int pd, long long h, int var){
    if(!var){
        return h+1;
    }
    int mijloc;
    if(var && ps!=pd){
        mijloc = ps + (pd - ps)/2;
        if(v[mijloc]==x){
            var = 1;
            h = mijloc;
            cautare(x, v, mijloc, mijloc+2, h, 1);
        }else{
            var = 0;
            if(v[mijloc]>x){
                cautare(x, v, ps, mijloc-1, h, 0);
            }else{
                cautare(x, v, mijloc+1, pd, h, 0);
            }
        }
    }
}

long long cautare2(long long x, long long v[], int ps, int pd, long long h, int var){
    if(!var){
        return h+1;
    }
    int mijloc;
    if(var && ps!=pd){
        mijloc = ps + (pd - ps)/2;
        if(v[mijloc]==x){
            var = 1;
            h = mijloc;
            cautare2(x, v, mijloc, mijloc-2, h, 1);
        }else{
            var = 0;
            if(v[mijloc]>x){
                cautare2(x, v, ps, mijloc-1, h, 0);
            }else{
                cautare2(x, v, mijloc+1, pd, h, 0);
            }
        }
    }
}

long long v[100000], N, M, x, tip;

int main(){
    f >> N;
    for(int i = 0; i < N; i++){
         f >> v[i];
    }
    f >> M;

    while(M--){
        f >> tip >> x;
        if(tip == 0){
            g << cautare(x, v, 0, N-1, -2, 2);
        }else if(tip == 1){
            int y = cautare(x, v, 0, N-1, -2, 2);
            while(y==-1){
                    x--;
                    y = cautare(x, v, 0, N-1, -2, 2);
                }
            g << y;
        }else{
            int z = cautare2(x, v, 0, N-1, -2, 2);
            while(z==-1){
                    x--;
                    z = cautare2(x, v, 0, N-1, -2, 2);
            }
            g << z;
        }
        if(!M){
            break;
        }
        g << "\n";
    }
}