Cod sursa(job #2431186)

Utilizator Alex18maiAlex Enache Alex18mai Data 18 iunie 2019 14:28:21
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
//ALEX ENACHE

#include <algorithm>

using namespace std;

//#include <iostream>
#include <fstream>
ifstream cin ("cautbin.in");ofstream cout ("cautbin.out");

int v[100005];
int n;

int q_1 (int x){
    int st = 1;
    int dr = n;
    int ans = 0;
    while (st <= dr){
        int mij = st + dr;
        mij /= 2;
        if (v[mij] <= x){
            ans = mij;
            st = mij + 1;
        }
        else{
            dr = mij - 1;
        }
    }
    return ans;
}

int q_2 (int x){
    int st = 1;
    int dr = n;
    int ans = 0;
    while (st <= dr){
        int mij = st + dr;
        mij /= 2;
        if (v[mij] >= x){
            ans = mij;
            dr = mij - 1;
        }
        else{
            st = mij + 1;
        }
    }
    return ans;
}

int main() {

    //freopen("input", "r", stdin);freopen("output", "w", stdout);


    cin>>n;

    for (int i=1; i<=n; i++){
        cin>>v[i];
    }

    int m;
    cin>>m;

    for (int i=1; i<=m; i++){
        int tip , x;
        cin>>tip>>x;
        if (tip == 0){
            //caut cea mai din dr poz a.i. v[poz] = x, altfel afiseaza -1
            //0 -> 1 (cu conditia sa existe)
            int ans = q_1(x);
            if (v[ans] != x){
                cout<<-1<<'\n';
            }
            else{
                cout<<ans<<'\n';
            }
        }
        if (tip == 1){
            //caut cea mai din dr poz a.i. v[poz] <= x
            cout<<q_1(x)<<'\n';
        }
        if (tip == 2){
            //caut cea mai din st poz a.i. v[poz] >= x
            cout<<q_2(x)<<'\n';
        }
    }

    return 0;
}