Cod sursa(job #196233)

Utilizator znakeuJurba Andrei znakeu Data 24 iunie 2008 21:37:19
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
// seriously.. ive lost my focus n magic programming powas! 

#include <stdio.h>
#define MAXN 100005

int n,M;
int v[MAXN];

FILE *in  = fopen("cautbin.in","r");
FILE *out = fopen("cautbin.out","w");

void citire()
{
	
	int i;
	
	fscanf(in,"%d",&n);
	
	for (i=1; i<=n; ++i)
		fscanf(in,"%d",&v[i]);
	
	fscanf(in,"%d",&M);
	
}

int serci0(int x)
{
	int s,e,m;
	
	s=1; e=n; m=(s+e)/2;
	
	while (s!=e)
	{
		if (x<=v[m])
			e=(s+e)/2;
		else
			s=(s+e)/2+1;
		m=(s+e)/2;
	}
	
	if (x<v[s])
	{
		if (x==v[s-1] && s!=1)
			return s-1;		
		return -1;
	}
	if (x==v[s])
		return s;
	return -1;
}

int serci1(int x)
{
	int s,e,m;
	
	s=1; e=n; m=(s+e)/2;
	
	while (s!=e)
	{
		if (x<v[m])
			e=(s+e)/2;
		else
			s=(s+e)/2+1;
		m=(s+e)/2;
	}
	
	while (s>0 && v[s]>x)
		--s;
	if (s)
		return s;
	return -1;
}

int serci2(int x)
{
	int s,e,m;
	
	s=1; e=n; m=(s+e)/2;
	
	while (s!=e)
	{
		if (x<v[m])
			e=(s+e)/2;
		else
			s=(s+e)/2+1;
		m=(s+e)/2;
	}
	s--;
	while (v[s]==v[s-1])
		s--;
	
	while (s<=n && v[s]<x)
		++s;
	if (s<=n)
		return s;
	return -1;
}

void rezolv()
{	
	int i,a,b,k;
	
	for (i=0; i<M; ++i)
	{
		fscanf(in,"%d%d",&a,&b);
		
		if (a==0)
		{
			k=serci0(b);
			fprintf(out,"%d\n",k);
		}
		if (a==1)
		{
			k=serci1(b);
			fprintf(out,"%d\n",k);			
		}
		if (a==2)
		{
			k=serci2(b);
			fprintf(out,"%d\n",k);
		}
	}

	fclose(in);
	fclose(out);
}

int main()
{
	
	citire();
	rezolv();
	eval();
	
	return 0;
}