Cod sursa(job #2795286)

Utilizator teomarsTeodora Sintea teomars Data 6 noiembrie 2021 10:41:44
Problema Cautare binara Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <cstdio>

using namespace std;

int a[100005], n, m, p;

int putere(int p){
    if(p >= n)
        return p;
    return putere(p*2);
}

void citire(){
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    cin >> m;
}

int caut_0_1(int x, int v){
    int i, l;
    for(i = 0, l = p; l > 0; l >>= 1)
        if(i + l <= n && a[i+l] <= x)
            i += l;
    if(v == 0 && a[i] == x)
        return i + 1;
    else
        if(v == 0)
            return -1;
    return i + 1;
}

int caut_2(int x){
    int i, l;
    for(i = n, l = p; l > 0; l >>= 1)
        if(i - l > 0 && a[i-l] >= x)
            i -= l;
    if(a[i] >= x)
        return i + 1;
}

int main()
{
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    citire();
    p = putere(1);
    for(int i = 0; i < m; i++){
        int v, x;
        cin >> v >> x;
        if(v == 0 || v == 1){
            cout << caut_0_1(x, v) << '\n';
            continue;
        }
        if(v == 2){
            cout << caut_2(x) << '\n';
            continue;
        }
    }
    return 0;
}