Cod sursa(job #2424406)
Utilizator | Data | 22 mai 2019 23:03:32 | |
---|---|---|---|
Problema | Cautare binara | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.28 kb |
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
#define nmax 200010
int n,m,x,task,v[nmax],aux,nr,poz;
int Binary_search(int x)
{
int left=1,right=n,poz=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(v[mid]==x)
{
poz=mid;
break;
}
if(v[mid]>x)
right=mid-1;
if(v[mid]<x)
left=mid+1;
}
return poz;
}
int BS2(int x)
{
int left=1,right=n,poz=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(v[mid]==x)
{
poz=mid;
break;
}
if(v[mid]>x)
right=mid-1;
if(v[mid]<x)
left=mid+1;
}
if(poz==-1)
poz=right;
return poz;
}
int main()
{
fin>>n;
for(int i=1;i<=n;i++)
fin>>v[i];
fin>>m;
for(int i=1;i<=m;i++)
{
fin>>task>>x;
switch(task)
{
case 0:
{
if(Binary_search(x)==-1)
fout<<-1<<'\n';
else
{
nr=x;
aux=Binary_search(x);
poz=aux;
for(int j=aux;j<=n;j++)
{
if(v[j]!=nr)
{
poz--;
break;
}
else
poz++;
}
fout<<poz<<'\n';
}
break;
}
case 1:
{
if(Binary_search(x)!=-1)
{
nr=x;
aux=Binary_search(x);
poz=aux;
for(int j=aux;j<=n;j++)
{
if(v[j]!=nr)
{
poz--;
break;
}
else
poz++;
}
fout<<poz<<'\n';
}
else
{
aux=BS2(x);
fout<<aux<<'\n';
}
break;
}
case 2:
{
if(Binary_search(x)!=-1)
{
nr=x;
aux=Binary_search(x);
poz=aux;
for(int j=aux;j>=1;j--)
{
if(v[j]!=nr)
{
poz++;
break;
}
else
poz--;
}
fout<<poz<<'\n';
}
else
{
aux=BS2(x)+1;
fout<<aux<<'\n';
}
break;
}
default:
{
break;
}
}
}
}