Cod sursa(job #2220735)

Utilizator AlexDabuDabu Alexandru AlexDabu Data 12 iulie 2018 13:58:02
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>

#define NMAX 100002

using namespace std;

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

struct customSet
{
	int first = 0; // first appearance of a certain value 
 	int last = 0; // last appearance of a certain value
	int value = 0;
};

int n, m;
customSet set[NMAX];

int BinarySearch(int value)
{
	int left = 1, right = n, middle;
	while (left <= right)
	{
		middle = left + (right - left) / 2;
		if (value == set[middle].value)
		{
			return middle;
		}
		if (value < set[middle].value)
		{
			right = middle - 1;
		}
		else if (value > set[middle].value)
		{
			left = middle + 1;
		}
	}
	return middle;
}

void Read(void)
{
	int i , prop, index = 1;
	fin >> n;
	for (i = 1; i <= n; i++)
	{
		fin >> prop;
		if (prop != set[index].value && set[index].value != 0)
		{
			set[index].last = i - 1;
			index++;
		}
		if (set[index].value == 0)
		{
			set[index].first = i;
			set[index].value = prop;
		}
	}
	set[index].last = n;
	fin >> m;
	int a , x;
	for (i = 1; i <= m; i++)
	{
		fin >> a >> x;
		prop = BinarySearch(x);
		switch (a)
		{
		case 0:
			if (set[prop].value != x)
			{
				fout << -1 << '\n';
			}
			else
			{
				fout << set[prop].last << '\n';
			}
			break;
		case 1:
			while (set[prop].value < x)
				prop++;
			prop--;
			fout << set[prop].last << '\n';
			break;
		case 2:
			while (set[prop].value > x)
				prop--;
			prop++;
			fout << set[prop].first << '\n';
			break;
		}
	}
}

int main(void)
{
	Read();
	return 0;
}