Cod sursa(job #1726283)

Utilizator serbanmaria15Serban Maria-Catalina serbanmaria15 Data 7 iulie 2016 17:47:14
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.66 kb
#include<stdio.h>

int cautBin(int v[], int inf, int sup, int cautat)
{
	int mijloc;
	if (inf > sup) return -1;
		mijloc=(inf+sup)/2;
		if( v[mijloc] == cautat)
			return mijloc;
		else
		{
			if( v[mijloc] > cautat)
				return cautBin(v, inf, mijloc-1, cautat);
			else
				return cautBin(v, mijloc + 1, sup, cautat);
		}
	
}

int cautBinPozMax(int v[], int inf, int sup, int cautat)
{
	int mijloc;
	while( inf <= sup)
	{
		mijloc = ( inf + sup)/2;
		if( v[mijloc] <= cautat) // daca gasete valoarea marim limita inferioara pentru a vedea daca avem mai avem pe o poz, cu indice mai mare val cautata
			inf = mijloc + 1;
		else
			sup = mijloc - 1;
	}
	mijloc = (inf + sup)/2;
	//daca nu gaseste valoare pe o poz cu indice mai mare, decrementam mijlocul
	if( v[mijloc] > cautat)
		mijloc--;
	if( v[mijloc] == cautat)
		return mijloc;
	return -1;
}

int cautBinPozMin(int v[], int inf, int sup, int cautat)
{
	int mijloc;
	while( inf <= sup)
	{
		mijloc = ( inf + sup)/2;
		if( v[mijloc] >= cautat) // daca gasete valoarea marim limita inferioara pentru a vedea daca avem mai avem pe o poz, cu indice mai mare val cautata
			sup = mijloc - 1;
		else
			inf = mijloc + 1;			
	}
	mijloc = (inf + sup)/2;
	//daca nu gaseste valoare pe o poz cu indice mai mare, decrementam mijlocul
	if( v[mijloc] < cautat)
		mijloc++;
	if( v[mijloc] == cautat)
		return mijloc;
	return -1;
}


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

	int n,m, tip, v[100000],i,x;
	int cautat1, cautat2, cautat3, cautat;
	int intermediar2, intermediar3;
	fscanf(inputFile, "%d", &n);
	for(i=0; i<n; i++)
	{
		fscanf(inputFile, "%d", &v[i]);
	}
	fscanf(inputFile, "%d", &m);
	for(i=0; i<m; i++)
	{
		fscanf(inputFile, "%d", &tip);
		fscanf(inputFile, "%d", &x);
		
		if( tip == 0)
		{
			cautat1 = cautBinPozMax(v, 0, n-1, x);
			fprintf(outputFile, "%d\n", cautat1 +1 );
		}
		if( tip == 1)
		{
			cautat = cautBinPozMax(v, 0, n-1, x);
			cautat2 = cautBinPozMax(v, 0, cautat, x);
			fprintf(outputFile, "%d\n", cautat2 +1 );
		}
		if( tip == 2)
		{
			cautat = cautBin(v, 0, n-1, x);
			cautat3= cautBinPozMin(v, cautat, n-1, x);
			fprintf(outputFile, "%d\n", cautat3 +1);
		}
	}
	return 0;
			



















	/*int x=cautBin1(v, 0, n-1, 3);
	fprintf(outputFile, "%d ", x+1);

	//pentru cerinta a doua
    int r=5;
	int p=cautBin(v, 0, n-1, 5);
	printf("%d", p);
	int q=cautBin1(v, 0, p, 3);
	printf("%d", q);
	 
	int w=cautBin(v, 0, n-1, 1);
	printf("%d", w);
	int cautat3=cautBin2(v,w, n-1, 3);
	printf("%d", cautat3);
	
   return 0;*/
}