Cod sursa(job #2385502)

Utilizator vlad_popaVlad Popa vlad_popa Data 21 martie 2019 22:28:36
Problema Cautare binara Scor 10
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <vector>

int binSearchRightToLeft(const std::vector<int>& vals, const int x) 
{
	int left = -1, right = vals.size()-1;
		
	while (right - left > 1) {
		int mid = (left + right) / 2;
		if (vals[mid] >= x) {
			right = mid;
		} else {
			left = mid;
		}
	}
	
	if (right >= (int)vals.size())
		return -1;
	
	return right;
}

int binSearchLeftToRight(const std::vector<int>& vals, const int x) 
{
	int left = 0, right = vals.size();
		
	while (right - left > 1) {
		int mid = (left + right) / 2;
		if (vals[mid] <= x) {
			left = mid;
		} else {
			right = mid;
		}
	}
	
	if (left < 0)
		return -1;
	
	return left;
}

int main (int argc, char const *argv[])
{
	/* code */
	std::ifstream in("cautbin.in");
	std::ofstream out("cautbin.out");
	
	int N;
	in >> N;
	std::vector<int> val(N);
	for (int i = 0; i < N; ++ i) {
		int x;
		in >> x;
		val[i] = x;
	}
	int M;
	in >> M;
	for (int i = 0; i < M; ++ i) {
		int t, v;
		in >> t >> v;
		int fnd = -1;
		if (t == 2)
			fnd = binSearchRightToLeft(val, v);
		else
			fnd = binSearchLeftToRight(val, v);
		
		if (t == 0 && fnd != v) {
			fnd = -2;
		}
		
		out << fnd+1 << "\n";
	}
	
	out.close();
	in.close();
	return 0;
}