Cod sursa(job #1987990)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 1 iunie 2017 19:32:14
Problema Cautare binara Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
// cautbin.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <fstream>
#define MAXN 10005
#define MAX(a,b) ( (a) > (b) ? (a) : (b))

using namespace std;

ifstream in("cautbin.in");
ofstream out("cautbin.out");

int N, M, v[MAXN];

void cit() {
	in >> N;
	for (int i = 1; i <= N; i++) {
		in >> v[i];
	}

}
int cautbin_0(int nr) {
	int mid, st = 1, dr = N;
	while (st <= dr) {

		mid = (st + dr) / 2;
		if (v[mid] > nr) {
			dr = mid - 1;
		}
		else if (v[mid] <= nr) {
			st = mid + 1;
		}

	}
	mid = (st + dr) / 2;
	if (v[mid] == nr) {
		return mid;
	}
	else {
		return -1;
	}
}
int cautbin_1(int nr) {
	int mid, st = 1, dr = N;
	while (st <= dr) {

		mid = (st + dr) / 2;
		if (v[mid] >= nr) {
			dr = mid - 1;
		}
		else if (v[mid] < nr) {
			st = mid  + 1;
		}
	}
	mid = (st + dr) / 2;
	if (v[mid] <= nr) {
		return mid;
	}
}
int cautbin_2(int nr) {
	int mid, st = 1, dr = N;
	while (st <= dr) {

		mid = (st + dr) / 2;
		if (v[mid] >= nr) {
			dr = mid - 1;
		}
		else if (v[mid] < nr) {
			st = mid + 1;
		}
	}
	mid = (st + dr) / 2;
	if (v[mid + 1] >= nr) {
		return mid + 1;
	}
	else if (v[mid] >= nr) {
		return mid;
	}
}

int main()
{
	cit();
	in >> M;
	for (int i = 1; i <= M; i++) {
		int a, nr;
		in >> a >> nr;
		if (a == 0) {
			out << cautbin_0(nr) << "\n";
		}
		else if (a == 1) {
			out << cautbin_1(nr) << "\n";
		}
		else {
			out << cautbin_2(nr) << "\n";
		}
	}
	return 0;
}