Cod sursa(job #2061560)

Utilizator Andreiii500Andrei Puiu Andreiii500 Data 9 noiembrie 2017 14:26:11
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<iostream>
#include<fstream>
using namespace std;

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

const int N = 100000;
int v[N];
int n,m;

int indexOf(int x){
    int left = 0;
    int right = n-1;
    while(left != right){
        int middle = (left + right) / 2;

        if(x <= v[middle])
            right = middle;
        else /// (x > v[middle])
            left = middle+1;
    }
    return left;
}

int query(int tip, int nr){
    if(tip == 0){
        int index = indexOf(nr);
        if(v[index] != nr)
            return -2;
        else{
            while(index < n-1  &&  v[index+1] == v[index]) /// Find the maximal index
                ++index;
            return index;
        }
    }
    else if(tip == 1){
        int index = indexOf(nr);
        while(v[index] > nr) /// Never overflows. Guaranteed!
            --index;
        while(index < n-1  &&  v[index+1] == v[index]) /// Find the maximal index
            ++index;
        return index;
    }
    else if(tip == 2){
        int index = indexOf(nr);
        while(v[index] < nr) /// Never...
            ++index;
        while(index > 0 && v[index-1] == v[index]) /// Find the minimal index
            --index;
        return index;
    }
    return -1;
}

int main()
{
    in>>n;
    for(int i=0; i<n; ++i)
        in>>v[i];
    in>>m;
    for(int i=0; i<m; ++i)
    {
        int tip,x;
        in>>tip>>x;
        cout<<(query(tip, x)+1)<<"\n";
    }
    return 0;
}