Cod sursa(job #2917041)

Utilizator vasi_kosminskiHoroi Vasile vasi_kosminski Data 2 august 2022 19:50:36
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>

std::ifstream fin("euclid2.in.txt");
std::ofstream fout("euclid2.out.txt");

void cautare_binara_0(int* x, int nr, int number, int st, int dr, int pos) {

	int mid = st + (dr - st) / 2;

	while (st <= dr && x[mid] == number)
	{
		if (mid > pos)
		{
			pos = mid + 1;
			st = mid + 1;
		}
		else
		{
			dr = mid - 1;
		}
		mid = st + (dr - st) / 2;
	}

	std::cout << pos + 1;
}

void cautare_binara_1(int* x, int nr, int number, int st, int dr, int pos) {

	int mid = st + (dr - st) / 2;

	while (st <= dr && x[mid] <= number)
	{
		if (x[mid] <= number)
		{
			if (mid > pos)
			{
				pos = mid + 1;
				st = mid + 1;
			}
			else
			{
				dr = mid - 1;
			}
		}
		mid = st + (dr - st) / 2;
	}

	std::cout << pos + 1;
}

void cautare_binara_2(int* x, int nr, int number, int st, int dr, int pos) {

	int mid = st + (dr - st) / 2;

	while (st <= dr && x[mid] >= number)
	{
		if ((mid > pos && pos == -1) || (mid < pos))
		{
			pos = mid + 1;
			dr = mid - 1;
		}
		else
		{
			st = mid + 1;
		}
		mid = st + (dr - st) / 2;
	}
	std::cout << pos + 1;
}

void operations(int* x, int n) {
	int nr;
	int number;

	while (fin >> nr >> number)
	{
		if (nr == 0)
		{
			cautare_binara_0(x, nr, number, 0, n - 1, -1);
		}
		else if (nr == 1)
		{
			cautare_binara_1(x, nr, number, 0, n - 1, -1);
		}
		else
		{
			cautare_binara_2(x, nr, number, 0, n - 1, -1);
		}
	}
}

int main() {
	int n;
	fin >> n;

	int* x = new int[n];

	for (int i = 0; i < n; i++) {
		fin >> x[i];
	}

	int m;
	fin >> m;

	operations(x, n);

	return 0;
}