Cod sursa(job #1677848)

Utilizator ciprian.costeaCostea Ciprian Marian ciprian.costea Data 6 aprilie 2016 20:30:01
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 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)
{
	unsigned int mid;
	while(low <= high)
	{
		mid = low + (high - low) / 2;
		if(vec[mid] <= elem)
		{
			low = mid + 1;
		}
		else
		{
			high = mid - 1;
		}
	}
	mid = (low + high) / 2;
	if(vec[mid] > elem)
	{
		mid--;
	}
	if(vec[mid] == elem)
	{
		return mid;
	}
	return -1; // nu s a gasit element
}

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;
		}
	}
	mid = (low + high) / 2;
	if(vec[mid] > elem)
	{
		mid--;
	} 
	return mid;
}

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;
		}
	}
	mid = (low + high) / 2;
	if(vec[mid] < elem)
	{
		mid++;
	}
	return mid;
}

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);
		// in output vectorul este contorizat de la 1 la n
		out << poz + 1 << "\n";
	}
	else if(p.first == 1)
	{
		poz = CautaBinar1(vec, p.second, 0, dimVec - 1);
		out << poz + 1 << "\n";
	}
	else
	{
		//std::cout << p.first << "\n";
		poz = CautaBinar2(vec, p.second, 0, dimVec - 1);
		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);
	}
}