Pagini recente » Cod sursa (job #60539) | Cod sursa (job #1709485) | Cod sursa (job #1712073)
#include <fstream>
using namespace std;
ifstream cin("cautbin.in");
ofstream cout("cautbin.out");
int n,m;
long long a[100005];
void Rezolva_0(int x)
{
bool gasit=false;
int st=1,dr=n,mj,poz;
while(st<=dr && gasit==false)
{
mj=st+(dr-st)/2;
if (x==a[mj])
{
gasit=true;
poz=mj;
}
else if (x<a[mj])
dr=mj-1;
else st=mj+1;
}
if (gasit==false) cout<<"-1\n";
else {
///va trebui sa vad ultima pozitie a lui x
while(a[poz]==x && poz<=n)
poz++;
cout<<poz-1<<"\n";
}
}
void Rezolva_1(int x)
{
///trebuie sa gasesc pozitia unde se afla primul x din vector
bool gasit=false;
int st=1,dr=n,mj,poz;
while(st<=dr && gasit==false)
{
mj=st+(dr-st)/2;
if (x==a[mj])
{
gasit=true;
poz=mj;
}
else if (x<a[mj]) dr=mj-1;
else st=mj+1;
}
///acum am pozitia poz, va trebuie sa il descresc pana la primul element x
while(a[poz]<=x && poz<=n)
poz++;
poz-=1;
cout<<poz<<"\n";
}
void Rezolva_2(int x)
{
bool gasit=false;
int st=1,dr=n,mj,poz;
while(st<=dr && gasit==false)
{
mj=st+(dr-st)/2;
if (x==a[mj])
{
gasit=true;
poz=mj;
}
else if (x<a[mj]) dr=mj-1;
else st=mj+1;
}
///acum ca am pozitia unde se gaseste o valoare x,
///voi putea calcula ce mi se cere la cerinta 1
while(a[poz]>=x && poz>=1)
poz--;
poz++;
cout<<poz<<"\n";
}
int main()
{
int i,val,x;
cin>>n;
for (i=1;i<=n;i++)
cin>>a[i];
cin>>m;
for (i=1;i<=m;i++)
{
cin>>val>>x;
/**
daca val este 0, trebuie sa vad care este
ultima pozitie de-a lui x (daca exista);
daca nu exista, voi pune -1
**/
if (val==0)
Rezolva_0(x);
else if (val==1)
Rezolva_1(x);
else if (val==2)
Rezolva_2(x);
}
return 0;
}