Pagini recente » Cod sursa (job #870624) | Cod sursa (job #508140) | Cod sursa (job #2709709) | Cod sursa (job #2784077) | Cod sursa (job #912042)
Cod sursa(job #912042)
#include <cstdio>
FILE *f=fopen("cautbin.in","r");
FILE *g=fopen("cautbin.out","w");
using namespace std;
int n,v[100001],times,operation,poz;
int bs0(int elem) // cautare binara pt caz 0
{
int li,lf,m;
li=1;lf=n,m=(li+lf)/2;
while(li<=lf)
{
if(v[m]<elem)
li=m+1;
else
if(v[m]>elem)
lf=m-1;
else
if(v[m]==elem)
{
while(v[m+1]==elem) m++;
return m;
}
m=(li+lf)/2;
}
if(li>lf)
return -1;
}
int bs1(int elem) // cautare binara caz 1
{
int li,lf,m;
li=1;lf=n,m=(li+lf)/2;
while(li<=lf)
{
if(v[m]<elem)
li=m+1;
else
if(v[m]>elem)
lf=m-1;
else
if(v[m]==elem)
{
while(v[m+1]==elem) m++;
return m;
}
m=(li+lf)/2;
}
if(li>lf)
return lf;
}
int bs2(int elem) // cautare binara caz 2
{
int li,lf,m;
li=1;lf=n,m=(li+lf)/2;
while(li<=lf)
{
if(v[m]<elem)
li=m+1;
else
if(v[m]>elem)
lf=m-1;
else
if(v[m]==elem)
{
while(v[m-1]==elem) m--; // cautam cea mai mica poz care comvine
return m;
}
m=(li+lf)/2;
}
if(li>lf)
return li; // li va fi > lf => li=primu' elem>m deci va fi elem cautat
}
int main()
{
fscanf(f,"%d",&n);
int i,sol;
for(i=1;i<=n;i++)
fscanf(f,"%d",&v[i]);
fscanf(f,"%d",×);
for(i=1;i<=times;i++)
{
fscanf(f,"%d%d",&operation,&poz);
if(operation==0)
sol=bs0(poz);
else
if(operation==1)
sol=bs1(poz);
else
if(operation==2)
sol=bs2(poz);
fprintf(g,"%d\n",sol);
}
return 0;
}