Cod sursa(job #869367)

Utilizator noruIlies Norbert noru Data 1 februarie 2013 15:37:23
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n,m,v[100001],maxim;
void citire(){
	f>>n;
	for (int i=1;i<=n;i++)
		f>>v[i];
}
void cautbin0(int x, int st,int dr)
{
	int mid;
	if (st<=dr&&st!=0)
	{
		mid=(st+dr)/2;
		if (st==dr&&v[mid]==x&&maxim<mid)
			maxim=mid;
		if (st<dr)		
		{
			if (x<v[mid])
				cautbin0(x,st,mid);
			else if (x>v[mid])
				cautbin0(x,mid+1,dr);
			else {
				cautbin0(x,st,mid);
				cautbin0(x,mid+1,dr);
			}
		}
	}
}
void cautbin1(int x, int st,int dr)
{
	int mid;	
	if (st<=dr&&st!=0)
	{
		mid=(st+dr)/2;
		if (st==dr&&v[mid]<=x&&maxim<mid)
			maxim=mid;
		if (st<dr){	if (x<v[mid])
				cautbin1(x,st,mid);
			else if (x>v[mid])
				cautbin1(x,mid+1,dr);
			else {
				cautbin1(x,st,mid);
				cautbin1(x,mid+1,dr);
			}
		}
	}
}
void cautbin2(int x, int st,int dr)
{
	int mid;
	if (st<=dr&&st!=0)
	{	mid=(st+dr)/2;
		if (st==dr&&v[mid]>=x&&maxim>mid)
			maxim=mid;
		if (st<dr){	if (x<v[mid])
				cautbin2(x,st,mid);
			else if (x>v[mid])
				cautbin2(x,mid+1,dr);
			else {
				cautbin2(x,st,mid);
				cautbin2(x,mid+1,dr);
			}
		}
	}
}
int main()
{
	citire();
	f>>m;
	for (int i=1;i<=m;i++)
	{
		int q,x;
		f>>q>>x;
		if (q!=2) maxim=-1;
		else maxim=100001;
		if (q==0) cautbin0(x,1,n);
		else if (q==1) cautbin1(x,1,n);
		else cautbin2(x,1,n);
		g<<maxim<<'\n';
	}
	return 0;
}