Pagini recente » Cod sursa (job #2624956) | Cod sursa (job #2678208)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int n,m;
int sir[100005];
int op,x;
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>sir[i];///citirea sirului
fin>>m;
while(m--)///pentru m=0 ---->fals ||||| ---->m!=0 ----->adevarat ------>while(adevarat)
{
fin>>op>>x;///citirea intrebarilor
int ans=0;
int st=1;
int dr=n+1;///sir[n+1] nu va fi niciodata apelat deoarece mid nu poate primii o valoare mai mare decat n
if(op==0)
{
///cea mai mare pozitie pe care se afla un element cu valoarea x
while(st<dr)
{
int mid=(st+dr)/2;
if(sir[mid]<=x)
{
st=mid+1;
ans=mid;
}
else
dr=mid;
}
if(sir[ans]!=x)
ans=-1;
}
else if(op==1)
{
///cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x
///sir[ans]<=x
while(st<dr)
{
int mid=(st+dr)/2;
if(sir[mid]<=x)
{
st=mid+1;
ans=mid;
}
else
dr=mid;
}
}
else
{
///cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x
///sir[ans]>=x ----> ans trebuie sa fie cat mai mic posibil
while(st<dr)
{
int mid=(st+dr)/2;
if(sir[mid]>=x)///atunci, ne putem lua un raspuns----> ans=mid
{
dr=mid;
ans=mid;
}
else///sir[mid]<x ---->nu are rost sa ne uitam in stanga pozitiei mid
st=mid+1;
}
}
fout<<ans<<"\n";///afisarea raspunsului pentru fiecare intrebare
}
return 0;
}