Cod sursa(job #673537)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 4 februarie 2012 16:40:49
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>

int a[100001];

int max_pos(int 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(int 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(int 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 (a[m] >= value)
		return min_pos_max_value(value, i1, m);

	return min_pos_max_value(value, m + 1, i2);
}

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("%d ", &a[i]);

	scanf("%d\n", &m);
	for (int i = 0; i < m; i++) {
		int code, x, result;
		scanf("%d %d\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:
			printf("%d\n", 1 + max_pos_min_value(x, 0, n - 1));
			break;
		case 2:
			printf("%d\n", 1 + min_pos_max_value(x, 0, n - 1));
			break;
		}
	}

	return 0;
}