Pagini recente » Cod sursa (job #1050932) | Cod sursa (job #3179066) | Cod sursa (job #2731947) | Cod sursa (job #2282789) | Cod sursa (job #2065289)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream in("cautbin.in");
ofstream out("cautbin.out");
const int NMAX = 100000;
int v[NMAX+2];
int n;
int ClasicBS(int x)
{
int low=1,high=n;
int mid = low + (high-low)/2;
while(low<=high)
{
int mid = low + (high-low)/2;
if(v[mid]==x)
return mid;
else if(v[mid]<x)
low=mid+1;
else
high=mid-1;
}
return -1;
}
int AddBS(int x,int pw2)
{
int sol=1;
for(int i=pw2;pw2>=1;pw2=pw2/2)
{
if(sol+pw2<=n && v[sol+pw2]<=x)
sol+=pw2;
}
return sol;
}
int RemoveBS(int x,int pw2)
{
int sol=n;
for(int i=pw2;pw2>=1;pw2=pw2/2)
{
if(sol-pw2>=1 && v[sol-pw2]>=x)
sol-=pw2;
}
return sol;
}
int pwgen(int k)
{
int pw2=1;
while(pw2<=k){pw2=pw2*2;}
return pw2/2;
}
int main()
{
int t;
int pw2;
in>>n;
for(int i=1;i<=n;i++)
{
in>>v[i];
}
in>>t;
pw2=pwgen(n);
for(int i=1;i<=t;i++)
{
int Case,x;
in>>Case>>x;
if(Case==0)
{
int sol=AddBS(x,pw2);
if(x==v[sol])
out<<sol<<'\n';
else
out<<-1<<'\n';
}
else if(Case==1)
{
out<<AddBS(x,pw2)<<'\n';
}
else
{
out<<RemoveBS(x,pw2)<<'\n';
}
}
}