Cod sursa(job #1612893)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 25 februarie 2016 08:46:59
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <functional>
#include <cmath>
#include <vector>
using namespace std;

template <typename Rit, typename Cmp, typename T>
Rit cautbin(Rit st, Rit dr, Cmp c, T t){
    // e esentialemente uppper bound - 1 -> ultima pozitie care da false cu functia
    // f(x) = c(t, a)
    // presupunem ca c(t, a[0]) e false

    const int n = dr-st+1;

    for(int i = 0, step = 1 << (int)log2(n); step > 0; step /= 2){
        if(st+step < dr && !c(t, st[step])){
            st += step;
        }
    }
    return st;
}

int main()
{
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");
    int n;
    f >> n;
    vector<int> v(n);
    for(int i = 0; i < n; ++i){
        f >> v[i];
    }
    int m;
    f >> m;
    for(int i = 0, t, x; i < m; ++i){
        f >> t;
        if(t == 0){
            f >> x;
            const int rez = cautbin(v.begin(), v.end(), less<int>(), x) - v.begin();
            g << (v[rez] == x ? rez+1 : -1) << '\n';
        }
        else if(t == 1){
            f >> x;
            g << (cautbin(v.begin(), v.end(), less<int>(), x) - v.begin() + 1) << '\n';
        }
        else if(t == 2){
            f >> x;
            g << n - (cautbin(v.rbegin(), v.rend(), greater<int>(), x) - v.rbegin()) << '\n';
        }
    }
    return 0;
}