Cod sursa(job #499767)

Utilizator andrei.finaruFinaru Andrei Emanuel andrei.finaru Data 10 noiembrie 2010 19:52:58
Problema Cautare binara Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<fstream.h>
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n,m,v[100001],i,tip,st,dr,p,gasit,mij,x;
void caut0()
{
	while(st<=dr&&!gasit)
		{mij=st+(dr-st)/2;
		if(v[mij]==x) gasit=1,p=mij;
			else if(v[mij]<x) st=mij+1;
					else dr=mij-1;}
	if(gasit) while(v[p+1]==x) p++;
		else p=-1;
}

void caut1()
{
	while(st<=dr&&!gasit)
		{mij=st+(dr-st)/2;
		if(v[mij]==x) gasit=1,p=mij;
			else if(v[mij]<x) st=mij+1;
					else dr=mij-1;}
	if(gasit) while(v[p+1]==x) p++;
		else {p=dr;
				if(v[p+1]<=x)p++;
					else while(v[p]>x)p--;}
}

void caut2()
{
	while(st<=dr&&!gasit)
		{mij=st+(dr-st)/2;
		if(v[mij]==x) gasit=1,p=mij;
			else if(v[mij]<x) st=mij+1;
					else dr=mij-1;}
	if(gasit) while(v[p-1]==x) p--;
		else {p=st;
				if(v[p-1]>=x) p--;
					else while(v[p]<x) p++;}
}

int main()
{
	f>>n;
	for(i=1;i<=n;i++) f>>v[i];
	f>>m;
	while(m--)
		{f>>tip>>x;
		st=1;dr=n;gasit=0;
		if(tip==0) caut0();
			else if(tip==1) caut1();
					else caut2();
		g<<p<<'\n';}
	f.close(); g.close();
	return 0;
}