Cod sursa(job #590364)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 16 mai 2011 23:21:05
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.98 kb
#include <stdio.h>
#include <stdlib.h>

int max_pos(int *a, int index1, int index2, int value)
{
	if (index1 == index2)
	{
		if (a[index1] == value)
			return index1;
		return -1;
	}

	int p = -1;
	int middle = index1 + (index2 - index1)/2;

	if (a[middle + 1] <= value)
		p = max_pos(a, middle + 1, index2, value);

	if (p == -1)
	{
		if (a[middle] <= value)
			p = max_pos(a, index1, middle, value);
	}
	
	return p;
}

int max_min_pos(int *a, int index1, int index2, int value)
{
	if (index1 == index2)
	{
		if (a[index1] <= value)
			return index1;
		return -1;
	}
	
	int p = -1;
	int middle = index1 + (index2 - index1)/2;

	if (value >= a[middle + 1])
		p = max_min_pos(a, middle + 1, index2, value);

	if (p == -1)
	{
		if (a[middle] <= value)
			p = max_min_pos(a, index1, middle, value);
	}
	
	return p;
}

int min_max_pos(int *a, int index1, int index2, int value)
{
	if (index1 == index2)
	{
		if (a[index1] >= value)
			return index1;
		return -1;
	}

	int p = -1;
	int middle = index1 + (index2 - index1)/2;

	if (a[middle] >= value)
		p = min_max_pos(a, index1, middle, value);

	if (p == -1)
	{
		if (a[middle + 1] <= value)
			p = min_max_pos(a, middle + 1, index2, value);
	}
	
	return p;
}

int main()
{
    int *a = NULL;
    int n = -1, m = -1, i, code, x, result;

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

    scanf("%d", &n);

    a = (int*)calloc(n, sizeof(int));

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

	scanf("%d", &m);

	for (i = 0; i < m; i++)
	{
		scanf("%d %d", &code, &x);

		switch (code)
		{
			case 0:
				result = max_pos(a, 0, n - 1 , x);
				if (result != -1)
					result++;
				printf("%d\n", result);
				break;
			case 1:
				result = max_min_pos(a, 0, n - 1, x);
				if (result != -1)
					result++;
				printf("%d\n", result);
				break;
			case 2:
				result = min_max_pos(a, 0, n - 1, x);
				if (result != -1)
					result++;
				printf("%d\n", result);
				break;
			default:
				break;
		}
	}
    
	free(a);

    return 0;
}