Cod sursa(job #216346)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 23 octombrie 2008 23:12:56
Problema Cautare binara Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.88 kb
#include<stdio.h>
#define nmax 100001
int v[nmax];
int i,n,m,x;

int binar0(int v[], int n, int x)
	{
	int l,r,m;
	l=1,r=n; //stabilim capetele vectorului
	while(l<=r) //cat timp putem cauta in vector
		{
		m=(l+r)/2; //mislocul portiunii v[l] - v[r]
		if(v[m]==x) return m; //am gasit elementul, deci returnam pozitia
		if(v[m]>x) r=m-1; //elementul gasit la pozitia m este mai mare dacat x, deci restrictionam cautarea in prima jumatate
		else l=m+1; //elementul gasit la pozitia m este mai mic decat x, deci restrictionam cautarea in a 2-a jumatate
		}
	return -1; //nu a fost gasit elementul
	}

int binar1(int v[], int n, int x)
	{
	int l,r,m,poz=-1;
	l=1,r=n; //stabilim capetele vectorului
	while(l<=r)
		{
		m=(l+r)/2; //mislocul portiunii v[i] - v[r]
		if(v[m]<=x) //mm gasit un numar mai mic sau egal decat x
			{
			poz=m; //salvam pozitia lui
			l=m+1; //cautam in continuare in partea dreapta un numar mai mare decat v[m] si mai mic sau egal decat x
			}
		else r=m-1; //numarul este mai mare, deci cautam in partea stanga
		}
	return poz;
	}

int binar2(int v[], int n, int x)
	{
	int l,r,m,poz=-1;
	l=1,r=n; //stabilim capetele vectorului
	while(l<=r)
		{
		m=(l+r)/2; //mislocul portiunii v[i] - v[r]
		if(v[m]>=x) //am gasit un numar mai mare sau egal cu x
			{
			poz=m; //salvam pozitia lui
			r=m-1; //cautam in continuare in partea stanga un numar mai mic decat v[m] si mai mare sau egal decat x
			}
		else l=m+1; //numarul este mai mic, deci cautam in partea dreapta
		}
	return poz;
	}
	
int main()
{
freopen("cautbin.in","r",stdin);
freopen("cautbin.out","w",stdout);

scanf("%d",&n);
for(i=1;i<=n;scanf("%d ",&v[i++]));

scanf("%d",&m);

while(m--)
  {
  scanf("%d %d",&i,&x);
  if(!i) printf("%d\n",binar0(v,n,x));
  else if(i==1) printf("%d\n",binar1(v,n,x));
  else if(i==2) printf("%d\n",binar2(v,n,x));
  }
return 0;
}