Cod sursa(job #1789766)

Utilizator iAnduAlexandru Banu iAndu Data 27 octombrie 2016 15:18:02
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#include <vector>
using namespace std;

vector<int> vec;

int pozEqual(int x, int n) {
	int st = 0, dr = n - 1, mij;

	while (st <= dr) {
		mij = st + ((dr - st) >> 1);
		if (vec[mij] == x) {
			int i = mij + 1;
			while (vec[i++] == vec[mij]);
			return i - 1;
		}
		else if (vec[mij] < x) {
			st = mij + 1;
		}
		else {
			dr = mij - 1;
		}
	}

	return -1;
}

int pozMax(int x, int n) {
	int st = 0, dr = n - 1, mij;

	while (st <= dr) {
		mij = st + ((dr - st) >> 1);
		if (vec[mij] > x && vec[mij - 1] <= x) {
			return mij - 1;
		}
		else if (mij == n - 1 || (vec[mij] <= x && vec[mij + 1] > x)) {
			return mij;
		} 
		else if (vec[mij] > x) {
			dr = mij - 1;
		}
		else {
			st = mij + 1;
		}
	}
}

int pozMin(int x, int n) {
	int st = 0, dr = n - 1, mij;

	while (st <= dr) {
		mij = st + ((dr - st) >> 1);
		if (vec[mij] < x && vec[mij + 1] >= x) {
			return mij + 1;
		}
		else if (mij == 0 || (vec[mij] >= x && vec[mij - 1] < x)) {
			return mij;
		}
		else if (vec[mij] < x) {
			st = mij + 1;
		}
		else {
			dr = mij - 1;
		}
	}
}

int main() {
	int n, m, question, x;

	ifstream in("cautbin.in");
	in >> n;
	for (int i = 0; i < n; ++i) {
		in >> x;
		vec.push_back(x);
	}
	in >> m;

	ofstream out("cautbin.out");
	for (int i = 0; i < m; ++i) {
		in >> question >> x;
		switch (question) {
		case 0: {
			out << pozEqual(x, n) << '\n';
			break;
		}
		case 1: {
			out << pozMax(x, n) + 1 << '\n';
			break;
		}
		case 2: {
			out << pozMin(x, n) + 1 << '\n';
			break;
		}
		}
	}
	in.close();
	out.close();

	return 0;
}