Cod sursa(job #1677817)

Utilizator ciprian.costeaCostea Ciprian Marian ciprian.costea Data 6 aprilie 2016 20:12:26
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

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

int CautaBinar(std::vector<int> &vec, int &elem, int low, int high)
{
	// conditia de oprire
	if(low > high)
	{
		return -1;
	}
	int mid = low + (high - low) / 2;
	if(vec[mid] == elem)
	{
		return mid;
	}
	if(vec[mid] > elem)
	{
		return CautaBinar(vec, elem, low, mid - 1);
	}
	else
	{
		return CautaBinar(vec, elem, mid + 1, high);
	}
}

int CautaBinar1(std::vector<int> &vec, int &elem, int low, int high)
{
	int mid = low + (high - low) / 2;
	while(high > low)
	{
		mid = low + (high - low) / 2;
		if(vec[mid] > elem)
		{
			high = mid;
		} 
		else
		{
			low = mid + 1;
		}
	}
	return low;
}

int CautaBinar2(std::vector<int> &vec, int &elem, int low, int high)
{
	int mid = low + (high - low) / 2;
	while(low <= high)
	{
		mid = low + (high - low) / 2;
		if(vec[mid] >= elem)
		{
			high = mid - 1;
		} 
		else
		{
			low = mid + 1;
		}
	}
	return (low - 1) < 0 ? -1 : low - 1;
}

void getRequests(std::vector<int> &vec, std::pair<int , int> &p, int &dimVec)
{
	int poz;
	if(p.first == 0)
	{
		poz = CautaBinar(vec, p.second, 0, dimVec - 1);
		if(poz == -1)
		{
			out << -1 << "\n";
			return;
		}
		// in output vectorul este contorizat de la 1 la n
		int k = poz;
		while(vec[k + 1] == vec[poz])
		{
			++k;
		}
		out << k + 1 << "\n";
	}
	else if(p.first == 1)
	{
		poz = CautaBinar1(vec, p.second, 0, dimVec - 1);
		//std::cout << "Pozitia este : " << poz << "\n";
		out << poz << "\n";
	}
	else
	{
		//std::cout << p.first << "\n";
		poz = CautaBinar2(vec, p.second, 0, dimVec - 1);
		//std::cout << "Pozitia este : " << poz << "\n";
		out << poz + 1 << "\n";
	}
} 

int main(void)
{
	int dimVec;
	in >> dimVec;

	std::vector<int> vec;
	int elem;
	for(int i = 0; i < dimVec; i++)
	{
		in >> elem;
		vec.push_back(elem);
	}

	int requests;
	in >> requests;

	// first -> tipul cererii
	// second -> numarul pe cerere
	std::vector < std::pair <int, int> > v;
	int type;
	int number;

	for(int i = 0; i < requests; i++)
	{
		in >> type;
		in >> number;
		std::pair <int, int> p(type, number);
		v.push_back(p);
	}

	for(int i = 0; i < requests; i++)
	{
		getRequests(vec, v[i], dimVec);
	}
}