Pagini recente » Monitorul de evaluare | Cod sursa (job #264076) | Cod sursa (job #2532849) | Cod sursa (job #2265877) | Cod sursa (job #2472398)
#include <fstream>
#include <iostream>
using namespace std;
int v[100001],cerinta,nr,pozitie,n,r;
ofstream fout ("cautbin.out");
int cautarebinara(int a);
void citire();
void rez();
void afis();
int main()
{
citire();
}
void citire()
{
int m;
ifstream fin("cautbin.in");
fin>>n;
for(int i =1; i <=n; i++)
fin>>v[i];
fin>>m;
for (int i=1; i<=m; i++)
{
fin>>cerinta>>nr;
rez();
}
}
void rez()
{
switch(cerinta)
{
case 0:
pozitie=cautarebinara(nr);
if(pozitie!=-1)
{
for(int i=pozitie+1; i<=n; i++)
{
if(v[i]==nr)
pozitie=i;
else
break;
}
}
afis();
break;
case 1:
pozitie=cautarebinara(nr);
if(pozitie!=-1)
{
for(int i=pozitie+1; i<=n; i++)
{
if(v[i]==nr)
pozitie=i;
else
break;
}
afis();
}
else
for(int i=(int)r;i>=1;i--)
if(v[i]<nr)
{
pozitie=i;
afis();
break;
}
break;
case 2:
pozitie=cautarebinara(nr);
if(pozitie!=-1)
{
for(int i=pozitie; i>=1; i--)
{
if(v[i]==nr)
pozitie=i;
else
break;
}
afis();
}
else
for(int i=(int)r;i>=1;i--)
if(v[i]<nr)
{
pozitie=i+1;
afis();
break;
}
break;
}
}
int cautarebinara(int a)
{
int mid,sol=-1;
int left=1;
int r=n;
while(left<=r)
{
mid=(left+r)/2;
if(v[mid]==a)
{
sol=mid;
break;
}
if(a<v[mid])
r=mid-1;
if(a>v[mid])
left=mid+1;
}
return sol;
}
void afis()
{
fout<<pozitie<<'\n';
}