Cod sursa(job #1007915)

Utilizator otilia_sOtilia Stretcu otilia_s Data 9 octombrie 2013 21:18:04
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 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) 
{	
	int sol = -2; 
	while (lo <= hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] == val) {
			sol = mid;
			lo = mid + 1;
		}
		else if (v[mid] < val)
			lo = mid + 1;
		else
			hi = mid - 1;
	}
	
	return sol + 1; //indexat de la 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) 
{
	int sol = -2;
	while (lo <= hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] <= val) {
			sol = mid;
			lo = mid + 1;
		}
		else 
			hi = mid - 1;
	}

	return sol + 1;
}

//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) 
{		
	int sol = -2;
	while (lo <= hi) {
		int mid = lo + (hi - lo) / 2;
		if (v[mid] >= val) {
			sol = mid;
			hi = mid - 1;
		}
		else
			lo = mid + 1;
	}

	return sol + 1;
}

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) << "\n";
				break;				
			case 1:
				fout << binary_search1(0, n - 1, val) << "\n";
				break;
			case 2:
				fout << binary_search2(0, n - 1, val) << "\n";
		}
	}
	
	return 0;
}