Cod sursa(job #2065073)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 13 noiembrie 2017 12:29:55
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <vector>
using namespace std;

int search1(const vector<int>& v, int target)
{
	int len = v.size();
	int left = 0, right = len - 1;
	
	while(left <= right)
	{
		int mid = left + (right - left) / 2;
		
		if(v[mid] <= target)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	int ans = -1;
	if(left > 0 && v[left - 1] == target)
	{
		ans = left - 1;
	}
	return ans;
}

int search2(const vector<int>& v, int target)
{
	int len = v.size();
	int left = 0, right = len - 1;
	
	while(left <= right)
	{
		int mid = left + (right - left) / 2;
		
		if(v[mid] <= target)
		{
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}
	return left - 1;
}

int search3(const vector<int>& v, int target)
{
	int len = v.size();
	int left = 0, right = len - 1;
	
	while(left <= right)
	{
		int mid = left + (right - left) / 2;
		
		if(v[mid] >= target)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return right + 1;
}

int main()
{
	ifstream in("cautbin.in");
	ofstream out("cautbin.out");
	
	int n;
	in >> n;
	vector<int> v(n);
	
	for(int i = 0;i < n;++i)
	{
		in >> v[i];
	}
	
	int m;
	in >> m;
	
	for(int i = 0;i < m;++i)
	{
		int op, target;
		in >> op >> target;
		int ret;
		
		if(op == 0)
		{
			ret = search1(v, target);
		}
		else if(op == 1)
		{
			ret = search2(v, target);
		}
		else
		{
			ret = search3(v, target);
		}
		if(ret != -1)
		{
			++ret;
		}
		out<<ret<<"\n";
	}
	in.close();
	out.close();
}