Cod sursa(job #2917049)

Utilizator vasi_kosminskiHoroi Vasile vasi_kosminski Data 2 august 2022 20:22:21
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

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

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

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

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

	fout << pos;
}

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

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

	fout << pos;
}

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

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

	if(x[st] >= number)
	{
		fout << st;
	}
	else
	{
		fout << dr;
	}
}

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

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

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

	int* x = new int[n];

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

	int m;
	fin >> m;

	operations(x, n);

	return 0;
}