Cod sursa(job #1752377)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 3 septembrie 2016 17:45:27
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

int* ReadVector(int n, ifstream &fin);
void SolveQuerys(int n, int* vect, istream &fin, ostream &fout);
int BinarySearch(int left, int right, int x, int* vect, bool flag);

int main()
{
	ifstream fin;
	ofstream fout;
	fin.open("cautbin.in");
	fout.open("cautbin.out");

	int n;
	fin >> n;

	int *vect = ReadVector(n, fin);

	SolveQuerys(n, vect, fin, fout);

	fin.close();
	fout.close();
}

int* ReadVector(int n, ifstream &fin)
{
	int *vect = new int[n + 1]();

	for (int i = 1; i <= n; i++)
		fin >> vect[i];

	return vect;
}

void SolveQuerys(int n, int* vect, istream &fin, ostream &fout)
{
	int m, opt, x;
	fin >> m;

	for (int i = 1; i <= m; i++)
	{
		fin >> opt >> x;
		bool flag = opt == 2 ? true : false;

		int pos = BinarySearch(1, n, x, vect, flag);

		switch (opt)
		{
			case 0:
				if (vect[pos] == x)
					fout << pos << "\n";
				else
					fout << -1 << "\n";
				break;
			case 1:
				fout << pos << "\n";
				break;
			case 2:
				if (vect[pos] == x)
					fout << pos << "\n";
				else
					fout << pos + 1 << "\n";
				break;
		}
	}
}

int BinarySearch(int left, int right, int x, int* vect, bool flag)
{
	if (left == right)
		return left;

	int mid = (left + right) / 2;

	if (x < vect[mid] || (x <= vect[mid] && flag))
		return BinarySearch(left, mid - 1, x, vect, flag);
	if (x == vect[mid] && x != vect[mid + 1])
		return mid;
	else
		return BinarySearch(mid + 1, right, x, vect, flag);
}