Cod sursa(job #1975192)

Utilizator andr2xeaAndreea Dincu andr2xea Data 30 aprilie 2017 11:38:25
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 4.48 kb
//#include <iostream>
//#include <fstream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>

/* cea mai mare pozitie pe care se afla un element cu valoarea x
 sau -1 daca aceasta valoare nu se gaseste in sir */
//int first_question(std::vector<int> &vector, int left, int right, int element) {
//    int pivot;
//    
//    while (left <= right) {
//        pivot = left + (right - left) / 2;
//        
//        if (element >= vector[pivot])
//            left = pivot + 1;
//        else
//            right = pivot - 1;
//    }
//    
//    pivot = left + (right - left) / 2;
//    
//    if (vector[pivot] > element)
//        pivot--;
//    if (vector[pivot] == element)
//        return pivot;
//    
//    return -1;
//}
//
///* cea mai mare pozitie pe care se afla un element cu valoarea mai mica
// sau egala cu x in sir. Se garanteaza ca cel mai mic numar al sirului
// este mai mic sau egal decat x */
//int second_question(std::vector<int> &vector, int left, int right, int element) {
//    int pivot;
//    
//    while (left < right) {
//        pivot = left + (right - left) / 2;
//        
//        if (element >= vector[pivot])
//            left = pivot + 1;
//        else
//            right = pivot;
//    }
//    
//    pivot = left + (right - left) / 2;
//    
//    if (vector[pivot] > element)
//        --pivot;
//    
//    return pivot;
//}
///* cea mai mica pozitie pe care se afla un element cu valoarea
//mai mare sau egala cu x in sir. Se garanteaza ca cel mai mare
//numar din sir este mai mare sau egal decat x */
//int third_question(std::vector<int> &vector, int left, int right, int element) {
//    int pivot;
//    
//    while (left < right) {
//        pivot = left + (right - left) / 2;
//        
//        if (element <= vector[pivot])
//            right = pivot;
//        else
//            left = pivot + 1;
//    }
//    
//    pivot = left + (right - left) / 2;
//    
//    if (vector[pivot] < element)
//        ++pivot;
//    
//    return pivot;
//}


//int main() {
//    std::ifstream in("cautbin.in");
//    std::ofstream out("cautbin.out");
//    
//    // Read size of the vector
//    int N;
//    in >> N;
//    
//    // Read vector
//    std::vector<int> vector(N);
//    for (int i = 0; i < N; i++)
//        in >> vector[i];
//    
//    // Read number of questions
//    int M;
//    in >> M;
//    
//    int question, element;
//    while (M--){
//        // Read questions
//        in >> question;
//        in >> element;
//        
//        // Call functions according to the type of question
//        switch (question) {
//            case 0:
//                out << first_question(vector, 0, N, element) << "\n";
//                break;
//            case 1:
//                out << second_question(vector, 0, N, element) << "\n";
//                break;
//            case 2:
//                out << third_question(vector, 0, N, element) << "\n";
//                break;
//            default:
//                break;
//        }
//    }
//    
//    return 0;
//}

#define N 100010
//int v[N];

int bsearch0 (std::vector<int> &v, int p, int u, int key) {
    int m;
    
    while (p <= u) {
        m = (p + u) / 2;
        if (v[m] <= key)
            p = m + 1;
        else
            u = m - 1;
    }
    m = (p + u) / 2;
    
    if (v[m] > key) m --;
    if (v[m] == key)
        return m;
    return -1;
}

int bsearch1 (std::vector<int> &v, int p, int u, int key) {
    int m;
    
    while (p < u){
        m = (p + u) / 2;
        if (v[m] <= key)
            p = m + 1;
        else
            u = m;
    }
    
    m = (p + u) / 2;
    if (v[m] > key)
        -- m;
    return m;
}

int bsearch2 (std::vector<int> &v, int p, int u, int key) {
    int m;
    
    while (p < u) {
        m = (p + u) / 2;
        if (v[m] < key)
            p = m + 1;
        else
            u = m;
    }
    
    m = (p + u) / 2;
    if (v[m] < key)
        ++ m;
    return m;
}

int main () {
    int i, n, m, tip, val;
    
    freopen("cautbin.in","r",stdin);
    freopen("cautbin.out","w",stdout);
    scanf("%d", &n);
    std::vector<int> vector(n);
    for (i = 1; i <= n; ++ i) {
        scanf("%d", &vector[i]);
//        vector[i] = aux
    }
    
    scanf("%d", &m);
    
    while (m --){
        scanf("%d%d", &tip, &val);
        if (tip == 0)
            printf("%d\n", bsearch0(vector, 1, n, val));
        if (tip == 1)
            printf("%d\n", bsearch1(vector, 1, n, val));
        if (tip == 2)
            printf("%d\n", bsearch2(vector, 1, n, val));
    }
    exit(0);
}