Cod sursa(job #2272126)

Utilizator arosearose red arose Data 29 octombrie 2018 18:33:59
Problema Cautare binara Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>

int cautare_binara(int vector[], int lo, int hi, int caz, int val)
{
	if (lo<=hi) {
		int med = lo + (hi-lo)/2;
		switch (caz)
		{
			case 0:
				if (val<vector[med])
				{
					return cautare_binara(vector,lo,med-1,caz,val);
				}
				else if (val>vector[med])
				{
					return cautare_binara(vector,med+1,hi,caz,val);
				}
				else {
					if (vector[med+1]==val) return cautare_binara(vector,med+1,med+1,caz,val);
					return med;
				}
				break;
			case 2:
				if (val>vector[med])
				{
					return cautare_binara(vector,med+1,hi,caz,val);
				}
				if (val<=vector[med])
				{
					if (vector[med+1]>val) return med;
					return cautare_binara(vector,lo,med-1,caz,val);
				}
				break;
			case 1:
				if (val<vector[med])
				{
					return cautare_binara(vector,lo,med-1,caz,val);
				}
				if (val>=vector[med])
				{
					if (vector[med-1]<val) return med;
					return cautare_binara(vector,med+1,hi,caz,val);
				}
				break;
		}
	}
	if (caz==2)
		return lo;
	if (caz==1)
		return hi;
	return -2;
}

int main()
{
	FILE *inptr = fopen("cautbin.in","r");
	FILE *outptr = fopen("cautbin.out","w");

	int nr = 0;
	fscanf(inptr,"%d", &nr);
	int vector[nr];
	for (int i=0;i<nr;i++)
	{
		fscanf(inptr,"%d ", &vector[i]);
	}
	int cases = 0;
	fscanf(inptr,"%d", &cases);
	int c, val;


	while (cases>0)
	{
		fscanf(inptr,"%d %d", &c, &val);
		fprintf(outptr,"%d\n", cautare_binara(vector, 0, nr-1, c, val)+1);

		cases--;
	}
	
	return 0;
}