Pagini recente » Cod sursa (job #612174) | Cod sursa (job #3254613) | Cod sursa (job #744185) | Cod sursa (job #2733729) | Cod sursa (job #2610283)
#include <fstream>
using namespace std;
ifstream fin("cautbin.in");
ofstream fout("cautbin.out");
int v[100005],vi[100005],vf[100005],n;
int w[100005];
int cautare0(int x)
{
int dr,st,mij;
dr=n;
st=1;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[mij]==x)
{
return vf[mij];
}
if(v[mij]<x)
st=mij+1;
else
dr=mij-1;
}
return -1;
}
//1 x - cea mai mare pozitie pe care se afla un element cu valoarea mai mica sau egala cu x in sir.
//Se garanteaza ca cel mai mic numar al sirului este mai mic sau egal decat x
int cautare1(int x)
{
// if (x==v[n])
// return vf[n];
int dr,st,mij,last=0;
st=1;
dr=n;
while (st<=dr)
{
mij=(st+dr)/2;
if (x>=v[mij])
{
last=vf[mij];
st=mij+1;
}
else
dr=mij-1;
}
return last;
}
//2 x - cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
//Se garanteaza ca cel mai mare numar din sir este mai mare sau egal decat x
int cautare2(int x)
{
//if (x==v[1])
// return vi[1];
int dr,st,mij,first=0;
st=1,dr=n;
while(st<=dr)
{
mij=(st+dr)/2;
if(x<=v[mij])
{
first=vi[mij];
dr=mij-1;
}
else
st=mij+1;
}
return first;
}
int main()
{
int m,q,x,i,poz;
fin>>n;
for(i=1; i<=n; i++)
{
fin>>x;
w[x]++;
}
n=0;
poz=0;
for(i=1; i<=100000; i++)
{
if(w[i]!=0)
{
n++;
v[n]=i;
vi[n]=poz+1;
vf[n]=vi[n]+w[i]-1;
poz=vf[n];
}
}
fin>>m;
for(i=1; i<=m; i++)
{
fin>>q>>x;
if(q==0)
{
fout<<cautare0(x)<<'\n';
}
if(q==2)
{
fout<<cautare2(x)<<'\n';
}
if (q==1)
{
fout<<cautare1(x)<<'\n';
}
}
return 0;
}