Cod sursa(job #539056)

Utilizator Carl896Carl Adam Carl896 Data 22 februarie 2011 12:19:51
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include "stdio.h"

int v[100000];


int cauta_bin(int *v, int n, int opt, int x)
{
	int st,dr;
	int keep = -2;
	int mkeep = -2;
	st = 0;
	dr = n-1;
	
	if(v == NULL)
	{
		return -1;
	}

	switch(opt)
	{
		case 0:
		{
			while(st<=dr)
			{
				if(v[(st+dr)/2]== x)
				{
					keep = (st+dr)/2;
					st = (st+dr)/2 + 1;
					continue;
				}

				if(v[(st+dr)/2]> x)
				{
					dr = (st+dr)/2 - 1;
					continue;
				}

				if(v[(st+dr)/2]< x)
				{
					st = (st+dr)/2 + 1;
					continue;
				}

			}
			return keep;
		}
		break;
		case 1:
		{
			while(st<=dr)
			{
				if(v[(st+dr)/2]== x)
				{
					keep = (st+dr)/2;
					st = (st+dr)/2 + 1;
					continue;
				}

				if(v[(st+dr)/2]> x)
				{
					dr = (st+dr)/2 - 1;
					continue;
				}

				if(v[(st+dr)/2]< x)
				{
					mkeep = (st+dr)/2;
					st = (st+dr)/2 + 1;
					continue;
				}
			}
				
			if(keep != -2)
			{
				return keep;
			}
			else 
			{
				return mkeep;	
			}
			
		}
		break;

		case 2:
		{
			while(st<=dr)
			{
				if(v[(st+dr)/2]== x)
				{
					keep = (st+dr)/2;
					dr = (st+dr)/2 - 1;
					continue;
				}

				if(v[(st+dr)/2]> x)
				{
					mkeep = (st+dr)/2;
					dr = (st+dr)/2 - 1;
					continue;
				}

				if(v[(st+dr)/2]< x)
				{
					
					st = (st+dr)/2 + 1;
					continue;
				}
			}
				
			if(keep != -2)
			{
				return keep;
			}
			else 
			{
				return mkeep;	
			}
			
		}
		break;

	}
	return -2;
}

int main()
{
	FILE *f,*g;
	int n,m,opt,x;
	int i=0;
	int rez;
	f = fopen("cautbin.in","r");
	g = fopen("cautbin.out","w");
	
	fscanf(f,"%d ",&n);
	
	while(i<n)
	{
		fscanf(f,"%d ",&v[i]);	
		i++;
	}
	
	fscanf(f,"%d ",&m);	
	
	i = 0;
	while(i<m)
	{
		fscanf(f,"%d %d ", &opt, &x);
		rez = cauta_bin(v, n, opt, x);
		fprintf(g,"%d \n", rez+1);
		i++;
	}

	fclose(f);
	fclose(g);

	return 0;
}