Cod sursa(job #622466)

Utilizator florin_marius90Florin Marius Popescu florin_marius90 Data 17 octombrie 2011 23:43:33
Problema Cautare binara Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <stdlib.h>

int cautare(int v[100001], int x, int first, int last)
{
	if (first == last && !x == v[first])
		return -1;
	if (first == last)
		return  first;
	int mid = first + (last - first)/2;
	if (v[mid] == x)
		return mid;
	if (v[mid] < x)
		return cautare(v, x, mid + 1, last);
	if (v[mid] > x)
		return cautare(v, x, first, mid - 1);
}

int f0(int v[100001], int x, int n)
{
	int poz = cautare(v, x,  0, n-1);
	if (poz == -1)
		return -1;
	while (v[poz] == v[poz + 1])
	{
		poz ++;
	}
	return poz + 1;
}

int f1(int v[100001], int x, int n)
{
	int poz = cautare(v, x,  0, n-1);
	while (v[poz] == v[poz + 1])
		poz ++;
	return poz + 1;
}

int f2(int v[100001], int x, int n)
{
	int poz = cautare(v, x, 0, n-1);
	
	while (v[poz] == v[poz - 1])
		poz --;
	return poz + 1;
}

int main()
{
	int v[100001];
	int n,m;
	
	FILE * f = fopen("cautbin.in","r");

	fscanf(f, "%i", &n);

	int i;
	for (i = 0; i < n; i++)
	{
		fscanf(f, "%i", v + i);
	}
	
	fscanf(f, "%i", &m);

	int tip, x;
	FILE * g = fopen("cautbin.out", "w");

	for (i = 0; i < m; i++)
	{
		fscanf(f, "%i%i", &tip, &x);

		if (tip == 0)
			fprintf(g, "%i\n", f0(v, x, n));
		if (tip == 1)
			fprintf(g, "%i\n", f1(v, x, n));
		if (tip == 2)
			fprintf(g, "%i\n", f2(v, x, n));
	}
	fclose(f);
	fclose(g);
	return 0;

}