Cod sursa(job #622526)

Utilizator florin_marius90Florin Marius Popescu florin_marius90 Data 18 octombrie 2011 02:43:12
Problema Cautare binara Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.62 kb
#include <stdio.h>
#include <stdlib.h>

int cautare0(int *v, int x, int first, int last)
{
	if (first == last && x != v[first])
		return v[first - 1] == x ? first - 1 : -1;
	if (first == last)
		return  first;
	int mid = (first + last) >> 1;
	   if (v[mid] <= x)
	      return cautare0(v, x, mid + 1, last);
	  else
		return cautare0(v, x, first, mid );
	
}

int cautare1(int *v, int x, int first, int last)
{
	if (first == last && x != v[first] )
	{
	  if (v[first] > x)
	      return first -1;
	  else
	     return first;
	}
	if (first == last)
		return  first;
	int mid = (first + last)>>1;
	   if (v[mid] <= x)
	      return cautare1(v, x, mid +1, last);
	  else
		return cautare1(v, x, first, mid );
	
}

int cautare2(int *v, int x, int first, int last)
{
	if (first == last && x != v[first] )
	{
	  if (v[first] < x)
	      return first + 1;
	  else
	     return first;
	}
	if (first == last)
		return  first;
	int mid = (first + last)>>1;
	   if (v[mid] < x)
	      return cautare2(v, x, mid + 1, last);
	  else
		return cautare2(v, x, first, mid );
	
}



int main()
{
	int v[100010];
	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)
		{ int rez = cautare0(v, x, 0,  n-1);
		    fprintf(g, "%i\n", rez == -1 ? -1 : rez + 1);
		}
		if (tip == 1)
			fprintf(g, "%i\n", cautare1(v, x, 0, n-1) + 1);
		if (tip == 2)
		{
			fprintf(g, "%i\n", cautare2(v, x, 0, n-1) +1);}
	}
	fclose(f);
	fclose(g);
	return 0;

}