Cod sursa(job #508671)

Utilizator eudummyEduard eudummy Data 9 decembrie 2010 13:04:29
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 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,st=1,dr=n;
	while (st<=dr)
	{
		mij=(st+dr)/2;
		if (s[mij]<=x)
			st=mij+1;
		else
			dr=mij-1;
	}
	mij=(st+dr)/2;
	if (s[mij]>x)
		mij--;
	if (s[mij]==x)
		printf("%ld \n",mij);
	else
		printf("-1 \n");
}
void caut1(long x)
{
	long mij,st=1,dr=n;
	while (st<=dr)
	{
		mij=(st+dr)/2;
		if (s[mij]<=x)
			st=mij+1;
		else
			dr=mij-1;
	}
	mij=(st+dr)/2;
	if (s[mij]>x)
		printf("%ld \n",mij-1);
	else
		printf("%ld \n",mij);
	
}
void caut2(long x)
{
	long mij,st=1,dr=n;
	while (st<=dr)
	{
		mij=(st+dr)/2;
		if (s[mij]<x)
			st=mij+1;
		else
			dr=mij-1;
	}
	mij=(st+dr)/2;
	if (s[mij]<x)
		printf("%ld \n",mij+1);
	else
		printf("%ld \n",mij);
}
int main()
{
	long x,m,i,a;
	ifstream f ("cautbin.in");
	freopen("cautbin.out","w",stdout);
	f>>n;
	for (i=1;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);
	}
}