Cod sursa(job #1759900)

Utilizator andreioneaAndrei Onea andreionea Data 19 septembrie 2016 23:23:48
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <vector>
#include <algorithm>

struct file_manip {

	std::ifstream fin;
	std::ofstream fout;

	file_manip(const char* filename) {
		std::string infilename  = std::string(filename) + ".in";
		std::string outfilename = std::string(filename) + ".out";
		fin.open(infilename.c_str());
		fout.open(outfilename.c_str());
	}

	template <class T>
	file_manip& operator << (const T& rhs) {
		fout << rhs;
		return *this;
	}
	template <class T>
	file_manip& operator >> (T& rhs) {
		fin >> rhs;
		return *this;
	}
};

int find_last(const std::vector<int> &v, int val)
{
	int fst = 0;
	int lst = v.size() - 1;
	while (fst <= lst)
	{
		int m = (fst + lst) / 2;
		if (v[m] < val) {
			fst = m + 1;
		}
		else if (v[m] > val) {
			lst = m - 1;
		}
		else {
			if (fst == lst) {
				return fst;
			}
			if (v[lst] == val) {
				return lst;
			}
			if (fst == m) {
				lst--;
			}
			else {
				fst = m;
			}
		}

	}
	return -1;
}

int find_less_or_equal(const std::vector<int> &v, int val)
{
	int fst = 0;
	int lst = v.size() - 1;
	while (fst != lst)
	{
		int m = (fst + lst) / 2;
		if (v[m] > val)
		{
			lst = m - 1;
		}
		else if (fst == m) {
			if (v[lst] <= val)
				return lst;
			return m;
		}
		else
		{
			fst = m;
		}
	}
	return fst;
}

int find_greater_or_equal(const std::vector<int> &v, int val)
{
	int fst = 0;
	int lst = v.size() - 1;
	while (fst != lst) 
	{
		int m = (fst + lst) / 2;
		if (v[m] < val)
		{
			fst = m + 1;
		}
		else if (lst == m)
		{
			return m;
		}
		else
		{
			lst = m;
		}
	}
	return fst;
}

int main()
{
	file_manip fm("cautbin");
	int n, m;
	int op, idx, x;
	std::vector<int> v;
	fm >> n;
	v.reserve(n);
	for (int i = 0; i < n; ++i)
	{
		fm >> m;
		v.push_back(m);
	}

	fm >> m;

	while (m--)
	{
		fm >> op >> idx;
		if (op == 0)
		{
			x = find_last(v, idx);
			if (x == -1)
				x -= 1;
			fm << x + 1 << "\n";
		}
		if (op == 1)
		{
			x = find_less_or_equal(v, idx);
			fm << x + 1 << "\n";
		}
		if (op == 2)
		{
			x = find_greater_or_equal(v, idx);
			fm << x + 1 << "\n";	
		}
	}
	return 0;
}