Cod sursa(job #1934781)
Utilizator | Data | 21 martie 2017 20:07:26 | |
---|---|---|---|
Problema | Cautare binara | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.15 kb |
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int n,t;
vector <pair<unsigned short,int> > v(100000);
void cautare_binara(int tip,unsigned long long nr)
{
int L=0,R=n-1,gasit=false,poz;
if(tip==2)poz=100001;
else poz=0;
unsigned long long m;
while(L<=R)
{
m=(L+R)/2;
switch(tip)
{
case 0:
{
if(v[m].first==nr)
{gasit=true;
if(v[m].second>poz)
poz=v[m].second;
}
if(v[m].first<=nr)
{
L=m+1;
}
else
{
R=m-1;
}
}
break;
case 1:
{
if(v[m].first<=nr)
{
gasit=true;
if(v[m].second>poz)
poz=v[m].second;
L=m+1;
}
else
{
R=m-1;
}
}
break;
case 2:
{
if(v[m].first>=nr)
{
gasit=true;
if(v[m].second<poz)
poz=v[m].second;
R=m-1;
}
else
{
L=m+1;
}
}
}
}
if(gasit==true)
g<<poz<<"\n";
else
g<<-1<<"\n";
}
int main()
{
f>>n;
for(int i=0;i<n;i++)
{
f>>v[i].first;
v[i].second=i+1;
}
sort(v.begin(),v.begin()+n);
f>>t;
int tip;
unsigned long long nr;
for(int i=0;i<t;i++)
{
f>>tip>>nr;
cautare_binara(tip,nr);
}
f.close();
g.close();
}