Cod sursa(job #236778)

Utilizator shnakoVlad Schnakovszki shnako Data 28 decembrie 2008 14:47:38
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream.h>
ifstream f("cautbin.in");
ofstream g("cautbin.out");
unsigned long v[100001], n, m, i;
int sw;

int zero (long k)
{
bool swx=0;
long t, x, y, xx, yy;
x=1;
y=n;
while (x<=y)
	{
   xx=x;
   yy=y;
	if (v[x+(y-x)/2]==k||x==y)
   	{
      t=x+(y-x)/2+1;
		while (v[t]==k)
         {
         swx=1;
   		t++;
         }
      	return t-1;
      }
   else
   	if (v[x+(y-x)/2]>k)
      	y=x+(y-x)/2-1;
      else
      	x=x+(y-x)/2+1;
      }
if (swx==0)
	return -1;

}

int unu (long k)
{
long x, y;
x=1;
y=n;
while (x<=y)
   if (v[x+(y-x)/2]>=k&&v[x+(y-x)/2-1]<=k)
   	if (v[x+(y-x)/2]==k)
      	return x+(y-x)/2;
      else
      	return x+(y-x)/2-1;
   else
   	if (v[x+(y-x)/2]>k)
      	y=x+(y-x)/2-1;
      else
      	x=x+(y-x)/2+1;
}

int doi(long k)
{
long x, y;
x=1;
y=n;
while (x<=y)
   if (v[x+(y-x)/2]>=k&&v[x+(y-x)/2-1]<=k)
   	if (v[x+(y-x)/2-1]==k)
      	return x+(y-x)/2-1;
      else
      	return x+(y-x)/2;
   else
   	if (v[x+(y-x)/2]>k)
      	y=x+(y-x)/2-1;
      else
      	x=x+(y-x)/2+1;
}

int main()
{
long k;
f>>n;
for (i=1;i<=n;i++)
	f>>v[i];
f>>m;
for (i=1;i<=m;i++)
	{
   f>>sw>>k;
   if (!sw)
   	g<<zero(k)<<"\n";
   else
   	if (sw==1)
      	g<<unu(k)<<"\n";
      else
      	g<<doi(k)<<"\n";
   }
f.close();
g.close();
return 0;
}