Pagini recente » Cod sursa (job #1453189) | Cod sursa (job #728890) | Clasament jevfkephfiberibereer | Cod sursa (job #2237039) | Cod sursa (job #1261197)
#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
int v[NMAX+5], n, i, nr, q, m;
int bs1mare (int st,int dr, int a)
{ int med,last=-1;
// cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
while (st<=dr)
{
med=(st+dr)>>1;//med=(dr+st)/2;
if (a==v[med]&&v[med+1]!=a)
return med;
else if (a>=v[med])
st=med+1;
else
dr=med-1;
}
return last;
}
int bs1mares (int st,int dr, int a)
{ int med,last=-1;
while (st<=dr)
{
med=(st+dr)>>1;//med=(dr+st)/2;
if (a<v[med]&&v[med-1]<a&&med>st||a<v[med]&&med==st)
return med;
else if (a>v[med])
st=med+1;
else
dr=med-1;
}
return last;
}
int bs1mic (int st,int dr, int a)
{ int med,last=-1;
while (st<=dr)
{
med=(st+dr)>>1;//med=(dr+st)/2;
if (a==v[med]&&v[med-1]!=a)
return med;
else if (a<=v[med])
dr=med-1;
else
st=med+1;
}
return last;
}
int bs1mics (int st,int dr, int a)
{ int med,last=-1;
//invers mai sus
while (st<=dr)
{
med=(st+dr)>>1;//med=(dr+st)/2;
if (a>v[med]&&v[med+1]>a&&med<dr||a>v[med]&&med==dr)
return med;
else if (a<v[med])
dr=med-1;
else
st=med+1;
}
return last;
}
int main()
{ ifstream cin("cautbin.in");
ofstream cout("cautbin.out");
cin>>n;
for (i=1; i<=n; i++)
cin>>v[i];
cin>>m;
for (i=1; i<=m; i++)
{
cin>>q>>nr;
if(q==0)cout<<bs1mare(1,n,nr)<<'\n';
else if(q==1)
{
if(bs1mare(1,n,nr)!=-1)cout<<bs1mare(1,n,nr)<<'\n';
else cout<<bs1mics(1,n,nr)<<'\n';
}
else if(q==2)if(bs1mic(1,n,nr)!=-1)cout<<bs1mic(1,n,nr)<<'\n';
else cout<<bs1mares(1,n,nr)<<'\n';
}
return 0;
}