Cod sursa(job #1598920)

Utilizator rosuflaRosu Flaviu rosufla Data 13 februarie 2016 14:34:01
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
// Day5V2.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbit.out");
int a[100],n;
int BinZero(int value);
int BinOne(int value);
int BinTwo(int value);
void citire() {
	int nr;
	f >> n;
	for (int i = 1; i <= n; ++i) {
		f >> nr;
		a[i] = nr;
	}
	int tip, value, nrFunc;
	f >> nrFunc;
	for (int i = 0; i < nrFunc; ++i) {
		f >> tip >> value;
		switch (tip)
		{
		case 0:
			g << BinZero(value) <<"\n";
			break;
		case 1:
			g << BinOne(value) <<"\n";
			break;
		case 2:
			g << BinTwo(value) <<"\n";
			break;
		default:
			break;
		}
	}
}
int BinZero(int value) {
	int low = 1, high = n,mid = (low+high)/2,j;
	bool ok = true;
	while (ok) {
		if (a[mid] == value) {
			j = mid + 1;
			while (value == a[j]) {
				++j;
			}
			return j-1 ;
			ok = false;
		}
		if (a[mid] < value) {
			low = mid + 1;
			mid = (low + high) / 2;
		}
		if (a[mid] > value) {
			high = mid - 1;
			mid = (low + high) / 2;
		}
		if (low == mid || high == mid)
			ok = false;
	}
	return -1;
}
int BinOne(int value) {
	int low = 1, high = n, mid = (low + high) / 2, j;
	bool ok = true,ok2 = true;
	while (ok2) {
		if (ok == false) {
			ok = true;
			value = value - 1;
		}
		while (ok) {
			if (a[mid] == value) {
				j = mid + 1;
				while (value == a[j]) {
					++j;
				}
				return j-1;
				ok = false;
			}
			if (a[mid] < value) {
				low = mid + 1;
				mid = (low + high) / 2;
			}
			if (a[mid] > value) {
				high = mid - 1;
				mid = (low + high) / 2;
			}
			if (low == mid || high == mid)
				ok = false;
		}
	}
	return -1;
}
int BinTwo(int value) {
	int low = 1, high = n, mid = (low + high) / 2, j;
	bool ok = true,ok2 = true;
	while (ok2) {
		if (ok == false) {
			ok = true;
			value = value + 1;
		}
		while (ok) {
			if (a[mid] == value) {
				j = mid - 1;
				while (value == a[j]) {
					--j;
					
				}
				return j+1;
				ok = false;
			}
			if (a[mid] < value) {
				low = mid + 1;
				mid = (low + high) / 2;
			}
			if (a[mid] > value) {
				high = mid - 1;
				mid = (low + high) / 2;
			}
			if (low == mid || high == mid)
				ok = false;
		}

	}
	return -1;
}
int main() {
	citire();
	return 0;
}