Cod sursa(job #1675125)

Utilizator m.scarlat95Scarlat Marius-George m.scarlat95 Data 5 aprilie 2016 09:15:37
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int first(int v[], int lower, int upper, int x)
{
	if(lower > upper) 
	{
		return  -1;
	}

	int middle = lower + (upper - lower)/2;

	if( (middle == upper && v[middle] == x) || (v[middle] == x && v[middle+1] > x) )
	{
		return middle;
	}
	else if(v[middle] <= x)
	{
		return first(v, middle + 1, upper, x);
	}
	else {
		return first(v, lower, middle - 1, x);
	}
}

int second(int v[], int lower, int upper, int x)
{
	if(lower > upper) 
	{
		return  -1;
	}

	int middle = lower + (upper - lower)/2;

	if( (middle == upper && v[middle] <= x) || (v[middle] <= x && v[middle+1] > x) )
	{
		return middle;
	}
	else if(v[middle] <= x)
	{
		return first(v, middle + 1, upper, x);
	}
	else {
		return first(v, lower, middle - 1, x);
	}
}

int third(int v[], int lower, int upper, int x)
{
	if(lower > upper) 
	{
		return  -1;
	}

	int middle = lower + (upper - lower)/2;

	if( (middle == lower && v[middle] >= x) || (v[middle] >= x && v[middle-1] < x) )
	{
		return middle;
	}
	else if(v[middle] < x)
	{
		return first(v, middle + 1, upper, x);
	}
	else {
		return first(v, lower, middle - 1, x);
	}
}

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

	int n, m, i;

	fin >> n;
	int v[n];

	for(i = 1; i <= n; ++i)
	{
		fin >> v[i];
	}

	fin >> m; 
	int curr_case, x;
	for(i = 1; i<= m; ++i)
	{
		fin >> curr_case >> x;
		cout << curr_case << " " << x << endl;
		
		switch(curr_case)
		{
			case 0 :
				fout  << first(v, 1, n, x) << endl; 
				break;
			case 1 :
				fout << second(v, 1, n, x) << endl;
				break;
			case 2:
				fout << third(v, 1, n, x) << endl;
				break;
		}
		
	}
	return 0;
}