Cod sursa(job #2608106)

Utilizator FLORENTIN-GIULIANO.DUMITRUDumitru Florentin Giuliano FLORENTIN-GIULIANO.DUMITRU Data 30 aprilie 2020 16:36:18
Problema Cautare binara Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.5 kb
#include <fstream>
#include <iostream>
#include <vector>

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

std::vector<std::vector<int> > vec;
int n;

int case0(int val){
    int nr = -1;
    int lower = 0;
    int upper = n - 1;
    int middle;
    while (lower <= upper){
        middle = lower + (upper - lower)/2;
        if (vec[middle][0] == val)
            return vec[middle][2];
        else if (vec[middle][0] > val)
            upper = middle - 1;
        else
            lower = middle + 1;
    }
    return nr;
}

int case1(int val){
    int nr = -1;
    int lower = 0;
    int upper = n - 1;
    int middle;
    while (lower <= upper){
        middle = lower + (upper - lower)/2;
        if (vec[middle][0] == val)
            return vec[middle][2];
        else if (vec[middle][0] > val)
            upper = middle - 1;
        else{
            nr = vec[middle][2];
            lower = middle + 1;
        }
    }
    return nr;
}

int case2(int val){
    int nr = -1;
    int lower = 0;
    int upper = n - 1;
    int middle;
    while (lower <= upper){
        middle = lower + (upper - lower)/2;
        if (vec[middle][0] == val)
            return vec[middle][1];
        else if (vec[middle][0] > val) {
            nr = vec[middle][1];
            upper = middle - 1;
        }
        else
            lower = middle + 1;
    }

    return nr;
}

int main(){

    int poz = 0;
    in >> n;
    int i = 1;

    int val;
    in >> val;
    std::vector<int> actual;
    actual.push_back(val);
    actual.push_back(i);
    actual.push_back(i);
    vec.push_back(actual);

    while (i < n){
        i ++;
        in >> val;
        if (vec[poz][0] == val){
            vec[poz][2] = i;
        } else {
            actual.clear();
            actual.push_back(val);
            actual.push_back(i);
            actual.push_back(i);
            vec.push_back(actual);
            poz ++;
        }
    }

    n = poz + 1;

    int query;
    in >> query;
    while (query){
        query --;
        int operatie, val;
        in >> operatie >> val;
        switch (operatie) {
            case 0:
                out << case0(val) << "\n";
                break;
            case 1:
                out << case1(val) << "\n";
                break;
            case 2:
                out << case2(val) << "\n";
                break;
        }
    }

    in.close();
    out.close();

    return 0;

}