Cod sursa(job #2801534)

Utilizator vasile117Bora Vasile-Florin vasile117 Data 16 noiembrie 2021 15:12:05
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
using namespace std;

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

int cautareBinara0(int a, int v[], int n) {
	int lo = 1, hi = n;
	int sol = -1;
	while (lo <= hi) {
	int mid = lo + (hi - lo) / 2;
		if (v[mid] == a) {
			sol = mid;
		}
		if (v[mid] <= a) {
			lo = mid + 1;
		}
		if (v[mid] > a) {
			hi = mid - 1;
		}
	}
	return sol;
}

int cautareBinara1(int a, int v[], int n) {
	int sol = -1;
	for (int i = a; i > 0; --i) {
	int lo = 1, hi = n;
		while (lo <= hi) {
			int mid = lo + (hi - lo) / 2;
			if (v[mid] == a) {
				sol = mid;
			}
			if (v[mid] <= a) {
				lo = mid + 1;
			}
			if (v[mid] > a) {
				hi = mid - 1;
			}
		}
		if (sol != -1)
			return sol;
	}
	return sol;
}

int cautareBinara2(int a, int v[], int n) {
	int lo = 1, hi = n;
	int sol = -1;
	int max = 1;
	for (int i = 1; i <= n; ++i) {
		if (max < v[i])
			max = v[i];
	}
	for (int i = a; i <= max; ++i) {
		while (lo <= hi) {
			int mid = lo + (hi - lo) / 2;
			if (v[mid] == a) {
				sol = mid;
			}
			if (v[mid] < a) {
				lo = mid + 1;
			}
			if (v[mid] >= a) {
				hi = mid - 1;
			}
		}
		if (sol != -1)
			return sol;
	}
	return sol;
}

int v[100001], n, m;

int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i)
		cin >> v[i];
	cin >> m;
	int x, z;
	for (int i = 1; i <= m; ++i) {
		cin >> x >> z;
		if (x == 0)
			cout << cautareBinara0(z, v, n) << "\n";
		else if (x == 1)
			cout << cautareBinara1(z, v, n) << "\n";
		else if (x == 2)
			cout << cautareBinara2(z, v, n) << "\n";
	}
	return 0;
}