Cod sursa(job #1166948)

Utilizator smallOneAdina Mateescu smallOne Data 3 aprilie 2014 23:52:52
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.91 kb
/*
ID: adinama1
PROG: test
LANG: C++
*/

#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>

using namespace std;

#define LIM 100005

int v[LIM], n;

int solveB(int val) { // pentru cazul in care elem din v sunt unice... nu stim exact pe care il alegem daca avem mai multe elem de acelasi tip
    int st = 0;
    int dr = n - 1;
    while (st <= dr) {
        int m = (dr + st) / 2;
        if(val < v[m]) {
            dr = m;
        } else if(val > v[m]) {
            st = m;
        } else {
            return m;
        }
    }
    return -1;
}

// determina care este poz cea mai mare din v pe care se afla valoarea val
int solve1(int val) { // pentru cazul in care elem din v nu sunt unice...
    int st = 0;
    int dr = n - 1;
    int pos = -2;
    while (st <= dr) {
        int m = (dr + st) / 2;
        if(val < v[m]) {
            dr = m - 1;
        } else if(val >= v[m]) {
            if(val == v[m])
                pos = m;
            st = m + 1;
        }
    }
    return pos;
}

// determina care este poz cea mai mare din v pe care se afla o valoare mai mica sau egala cu val
int solve2(int val) { // pentru cazul in care elem din v nu sunt unice...
    int st = 0;
    int dr = n - 1;
    int pos = -1;
    while (st <= dr) {
        int m = (dr + st) / 2;
        if(val < v[m]) {
            dr = m - 1;
        } else if(val >= v[m]) {
            pos = m;
            st = m + 1;
        }
    }
    return pos;
}

// determina care este poz cea mai mare din v pe care se afla o valoare mai mica sau egala cu val
int solve3(int val) { // pentru cazul in care elem din v nu sunt unice...
    int st = 0;
    int dr = n - 1;
    int pos = -1;
    while (st <= dr) {
        int m = (dr + st) / 2;
        if(val <= v[m]) {
            pos = m;
            dr = m - 1;
        } else if(val > v[m]) {
            st = m + 1;
        }
    }
    return pos;
}

int main() {
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out","w", stdout);

	int m, op, num;

	cin >> n;
    for(int i = 0; i < n; ++i) {
        cin >> v[i];
    }
    // sort(v, v + n);
	cin >> m;
	for(int i = 0; i < m; ++i) {
        cin >> op >> num;
        switch(op) {
            case 0: cout << solve1(num) + 1 << endl;
                    break;
            case 1: cout << solve2(num) + 1 << endl; // cea mai mare poz pe care se afla un element <= num
                break;
            default: cout << solve3(num) + 1 << endl; // cea mai mica poz pe care se afla un element >= num
        }
	}
    return 0;
}