Cod sursa(job #1675178)

Utilizator RazzinnatorRazvan Brinzea Razzinnator Data 5 aprilie 2016 09:51:26
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 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(int v[], int x, int left, int right) {
	if (left == right || left + 1 == right) {
		if (v[left] > x) return left - 1;
		if (v[left] < x) return left + 1;
		return left;
	}

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

int v[100001];

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

	int n, x, op, nr_op;

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

	// 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, n - 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;
}