Cod sursa(job #486846)

Utilizator ChallengeMurtaza Alexandru Challenge Data 22 septembrie 2010 22:25:00
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>

using namespace std;

const char InFile[]="cautbin.in";
const char OutFile[]="cautbin.out";
const int MaxN=100010;

ifstream fin(InFile);
ofstream fout(OutFile);

int v[MaxN],n,m,op,x;

int cauta_egal(int x)
{
	int u=n;
	int p=1;
	int m;
	while(p<=u)
	{
		m=p+(u-p)/2;
		if(x<v[m])
		{
			u=m-1;
		}
		else if(v[m]<=x)
		{
			p=m+1;
		}
	}

	if(u<=n && v[u]==x)
	{
		return u;
	}
	return -1;
}

int cauta_maimic_egal(int x)
{
	int u=n;
	int p=1;
	int m;
	while(p<=u)
	{
		m=p+(u-p)/2;
		if(x<v[m])
		{
			u=m-1;
		}
		else if(v[m]<=x)
		{
			p=m+1;
		}
	}

	return u;
}

int cauta_maimare_egal(int x)
{
	int u=n;
	int p=1;
	int m;
	while(p<=u)
	{
		m=p+(u-p)/2;
		if(x<=v[m])
		{
			u=m-1;
		}
		else if(v[m]<x)
		{
			p=m+1;
		}
	}

	return p;
}

int main()
{
	fin>>n;
	for(register int i=1;i<=n;++i)
	{
		fin>>v[i];
	}
	fin>>m;
	for(register int j=1;j<=m;++j)
	{
		fin>>op>>x;
		if(op==0)
		{
			fout<<cauta_egal(x);
		}
		else if(op==1)
		{
			fout<<cauta_maimic_egal(x);
		}
		else
		{
			fout<<cauta_maimare_egal(x);
		}
		fout<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}