Cod sursa(job #1176054)

Utilizator cosgbCosmin cosgb Data 25 aprilie 2014 15:08:15
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <vector>

using namespace std;

int cautb0(vector<int> &v, int val) 
{
	int mid, left = 0, right = v.size() - 1;
	while (left <= right) {
		mid = (right - left) / 2 + left;
		if (val < v[mid]) {
			right = mid - 1;
		} else if (val >= v[mid]) {
			left = mid + 1;
		}
	}

	if (left >= 1 && v[left - 1] == val) {
		return left - 1;
	}
	return -2;
}

int cautb1(vector<int> &v, int val)
{
	int mid, left = 0, right = v.size() - 1;
	while (left <= right) {
		mid = (right - left) / 2 + left;
		if (val < v[mid]) {
			right = mid - 1;
		} else if (val >= v[mid]) {
			left = mid + 1;
		}
	}
	
	return left - 1;
}

int cautb2(vector<int> &v, int val)
{
	int mid, left = 0, right = v.size() - 1;
	while (left <= right) {
		mid = (right - left) / 2 + left;
		if (val <= v[mid]) {
			right = mid - 1;
		}
		else if (val > v[mid]) {
			left = mid + 1;
		}
	}

	return left;
}

int main()
{
	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);
	int N, M, c, tip;
	vector<int> elem;

	scanf("%d", &N);

	for (int i = 0; i < N; i++) {
		scanf("%d", &c);
		elem.push_back(c);
	}

	scanf("%d", &M);
	for (int i = 0; i < M; i++) {
		scanf("%d %d", &tip, &c);
		switch (tip) {
			case 0:
				printf("%d\n", cautb0(elem, c) + 1);
				break;
			case 1:
				printf("%d\n", cautb1(elem, c) + 1);
				break;
			case 2:
				printf("%d\n", cautb2(elem, c) + 1);
				break;
		}
	}

}