Cod sursa(job #2429958)
Utilizator | Data | 11 iunie 2019 22:56:55 | |
---|---|---|---|
Problema | Cautare binara | Scor | 70 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.26 kb |
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
#define nmax 100005
long long n,m,task,v[nmax],x,aux,k,j;
int Binary_Search(long long x)
{
int sol=-1,left=1,right=n;
while(left<=right)
{
int mid=(left+right)/2;
if(v[mid]==x)
{
sol=mid;
break;
}
else if(v[mid]>x)
right=mid-1;
else if(v[mid]<x)
left=mid+1;
}
return sol;
}
int Binary_Search2(long long x)
{
int left=1,right=n;
while(left<=right)
{
int mid=(left+right)/2;
if(v[mid]==x)
{
right=mid;
break;
}
else if(v[mid]>x)
right=mid-1;
else if(v[mid]<x)
left=mid+1;
}
return right;
}
int Binary_Search3(long long x)
{
int left=1,right=n;
while(left<=right)
{
int mid=(left+right)/2;
if(v[mid]==x)
{
left=mid;
break;
}
else if(v[mid]>x)
right=mid-1;
else if(v[mid]<x)
left=mid+1;
}
return left;
}
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
{
aux=Binary_Search(x);
j=aux;
while(j<=n)
{
if(v[j]==x)
j++;
else
{
j--;
break;
}
}
fout<<j<<'\n';
}
break;
}
case 1:
{
if(Binary_Search(x)!=-1)
{
aux=Binary_Search(x);
j=aux;
while(j<=n)
{
if(v[j]==x)
j++;
else
{
j--;
break;
}
}
fout<<j<<'\n';
}
else
fout<<Binary_Search2(x)<<'\n';
break;
}
case 2:
{
if(Binary_Search(x)!=-1)
{
aux=Binary_Search(x);
j=aux;
while(j>=1)
{
if(v[j]==x)
j--;
else
{
j++;
break;
}
}
fout<<j<<'\n';
}
else
fout<<Binary_Search3(x)<<'\n';
break;
}
}
}
}