Cod sursa(job #673547)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 4 februarie 2012 16:53:04
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <stdio.h>
#include <stdint.h>

uint64_t a[100001];

int max_pos(uint64_t value, int i1, int i2)
{
	if (i1 == i2) 
		return (a[i1] == value) ? i1 : -1;

	int m = i1 + (i2 - i1) / 2;

	if (value >= a[m + 1])
		return max_pos(value, m + 1, i2);

	return max_pos(value, i1, m);
}

int max_pos_min_value(uint64_t value, int i1, int i2)
{
	if (i1 == i2) 
		return (a[i1] == value) ? i1 : -1;

	int m = i1 + (i2 - i1) / 2;

	if (a[m] < value && value < a[m + 1])
		return m;

	if (value >= a[m + 1]) {
		int max = max_pos_min_value(value, m + 1, i2);
		return (max == -1) ? (m + 1) : max;
	}

	return max_pos_min_value(value, i1, m);
}

int min_pos_max_value(uint64_t value, int i1, int i2)
{
	if (i1 == i2) 
		return (a[i1] == value) ? i1 : -1;

	int m = i1 + (i2 - i1) / 2;

	if (a[m] < value && value < a[m + 1])
		return m + 1;

	if (value <= a[m]) {
		int result = min_pos_max_value(value, i1, m);
		return (result == -1) ? m : result;
	}

	int result = min_pos_max_value(value, m + 1, i2);
	return (result == -1) ? m + 1: result;
}

int main()
{
	int n, m;

	freopen("cautbin.in", "r", stdin);
	freopen("cautbin.out", "w", stdout);

	scanf("%d\n", &n);
	for (int i = 0; i < n; i++)
		scanf("%llu ", &a[i]);

	scanf("%d\n", &m);
	for (int i = 0; i < m; i++) {
		int code, result;
		uint64_t x;
		scanf("%d %llu\n", &code, &x);
		switch (code) {
		case 0:
			result = max_pos(x, 0, n - 1);
			printf("%d\n", (result == -1) ? -1 : (result + 1));
			break;
		case 1:
			result = max_pos_min_value(x, 0, n -1);
			printf("%d\n", (result == -1) ? -1 : (result + 1));
			break;
		case 2:
			result = min_pos_max_value(x, 0, n - 1);
			printf("%d\n", (result == -1) ? -1 : (result + 1));
			break;
		}
	}

	return 0;
}