Cod sursa(job #508660)

Utilizator eudummyEduard eudummy Data 9 decembrie 2010 12:43:31
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
/*Se da un sir de numere ordonat crescator cu N elemente, si se cere sa se raspunda la M intrebari de tipul:
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x 
	sau -1 daca aceasta valoare nu se gaseste in sir
1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
	Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
	Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
*/
#include <fstream>
#include <stdio.h>
using namespace std;
long n, s[100001];
void caut0(long x)
{
	long mij=n/2,st=0,dr=n-1;
	while ((s[mij]!=x)&&(st<=dr))
	{
		mij=st+(dr-st)/2;
		if (s[mij]>x)
			dr=mij-1;
		else
			st=mij+1;
	}
	if (dr>=st)
	{
		while (s[mij]==x)mij++;
		printf("%ld \n",mij);
	}
	else
		printf("-1 \n");
}
void caut1(long x)
{
	long mij=n/2,st=0,dr=n-1;
	while ((s[mij]!=x)&&(st<=dr))
	{
		mij=st+(dr-st)/2;
		if (s[mij]>x)
			dr=mij-1;
		else
			st=mij+1;
	}
	if (dr>=st)
	{
		while (s[mij]==x)mij++;
		printf("%ld \n",mij);
	}
	else
	{
		while (s[dr]<x)dr++;
		printf("%ld \n",dr);
	}
}
void caut2(long x)
{
	long mij=n/2,st=0,dr=n-1;
	while ((s[mij]!=x)&&(st<=dr))
	{
		mij=st+(dr-st)/2;
		if (s[mij]>x)
			dr=mij-1;
		else
			st=mij+1;
	}
	if (dr>=st)
	{
		while (s[mij]==x)mij--;
		printf("%ld \n",mij+2);
	}
	else
	{
		while (s[st]>x)st--;
		printf("%ld \n",st+2);
	}
}
int main()
{
	long x,m,i,a;
	ifstream f ("cautbin.in");
	freopen("cautbin.out","w",stdout);
	f>>n;
	for (i=0;i<n;i++)
		f>>s[i];
	f>>m;
	for (i=0;i<m;i++)
	{
		f>>a>>x;
		if (a==0)
			caut0(x);
		else
			if (a==1)
				caut1(x);
			else
				caut2(x);
	}
}