Cod sursa(job #1007898)

Utilizator otilia_sOtilia Stretcu otilia_s Data 9 octombrie 2013 20:56:57
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>

using namespace std;
const int NMAX = 100002;
int v[NMAX];

// cea mai mare pozitie pe care se afla un element cu valoarea val sau -1 daca aceasta valoare nu se gaseste in sir
int binary_search0(int lo, int hi,int val) 
{	
	while (lo < hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] > val)
			hi = mid;
		else
			lo = mid + 1;
	}
			
	if (!lo || v[hi] < val) 
		return -1;
	if (v[lo] == val)
		return lo;
	if (v[lo - 1] == val)
		return lo - 1;
	return -1;
}

//cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir. 
//Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x 
int binary_search1(int lo, int hi,int val) 
{
	while (lo < hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] > val)
			hi = mid;
		else
			lo = mid + 1;
	}
	
	if (v[lo] > val)
		return lo - 1;
	return lo;
}

//cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir. 
//Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
int binary_search2(int lo, int hi,int val) 
{	
	while (lo < hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] >= val)
			hi = mid;
		else
			lo = mid + 1;
	}

	return lo;
}

int main()
{
	ifstream fin("cautbin.in");
	ofstream fout("cautbin.out");
	
	int n, m;
	fin >> n;
	for (int i = 0; i < n; ++i)
		fin >> v[i];
	
	fin >> m;	
	while (m--) {
		int op, val;
		fin >> op >> val;
	
		switch (op) {
			case 0:
				fout << binary_search0(0, n - 1, val) << endl;
				break;				
			case 1:
				fout << binary_search1(0, n - 1, val) + 1 << endl;
				break;
			case 2:
				fout << binary_search2(0, n - 1, val) + 1<< endl;
		}
	}
	
	return 0;
}