Cod sursa(job #1675159)

Utilizator RazzinnatorRazvan Brinzea Razzinnator Data 5 aprilie 2016 09:41:13
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <fstream>


#include <vector>
using namespace std;

// Intoarce pozitia pe care se afla x sau pozitia pe care ar trebui inserat,
// daca nu se afla deja in vector.
int bsearch(vector<int> v, int x, int left, int right) {
	if (left == right) {
		if (v[left] > x) return left - 1;
		if (v[left] < x) return left + 1;
		return left;
	}

	int m = (left + right) / 2;
	if (v[m] == x) {
		while (v[m] == x) m++;
		return m - 1;
	}
	if (v[m] > x) return bsearch(v, x, left, m);
	return bsearch(v, x, m, right);
}

int main()
{
	ifstream f("cautbin.in");
	ofstream g("cautbin.out");

	int n, x, op, nr_op;

	// Citeste vectorul.
	vector<int> v;
	f >> n;
	for (int i = 0; i < n; i++) {
		f >> x;
		v.push_back(x);
	}

	// Citeste si executa fiecare test.
	f >> nr_op;
	for (int i = 0; i < nr_op; i++) {
		f >> op >> x;
		int result = bsearch(v, x, 0, v.size() - 1);
		
		if (op == 0) {
			if (v[result] != x) result = -1;
		}
		else if (op == 2) {
			if (v[result] == x) {
				while (v[result] == x) result--;
				result++;
			}
		}
		result++;
		g << result << endl;
	}

	f.close();
	g.close();
    return 0;
}