Pagini recente » Cod sursa (job #1401607) | Cod sursa (job #159398) | Cod sursa (job #3121097) | Cod sursa (job #718005) | Cod sursa (job #508660)
Cod sursa(job #508660)
/*Se da un sir de numere ordonat crescator cu N elemente, si se cere sa se raspunda la M intrebari de tipul:
0 x - cea mai mare pozitie pe care se afla un element cu valoarea x
sau -1 daca aceasta valoare nu se gaseste in sir
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
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
*/
#include <fstream>
#include <stdio.h>
using namespace std;
long n, s[100001];
void caut0(long x)
{
long mij=n/2,st=0,dr=n-1;
while ((s[mij]!=x)&&(st<=dr))
{
mij=st+(dr-st)/2;
if (s[mij]>x)
dr=mij-1;
else
st=mij+1;
}
if (dr>=st)
{
while (s[mij]==x)mij++;
printf("%ld \n",mij);
}
else
printf("-1 \n");
}
void caut1(long x)
{
long mij=n/2,st=0,dr=n-1;
while ((s[mij]!=x)&&(st<=dr))
{
mij=st+(dr-st)/2;
if (s[mij]>x)
dr=mij-1;
else
st=mij+1;
}
if (dr>=st)
{
while (s[mij]==x)mij++;
printf("%ld \n",mij);
}
else
{
while (s[dr]<x)dr++;
printf("%ld \n",dr);
}
}
void caut2(long x)
{
long mij=n/2,st=0,dr=n-1;
while ((s[mij]!=x)&&(st<=dr))
{
mij=st+(dr-st)/2;
if (s[mij]>x)
dr=mij-1;
else
st=mij+1;
}
if (dr>=st)
{
while (s[mij]==x)mij--;
printf("%ld \n",mij+2);
}
else
{
while (s[st]>x)st--;
printf("%ld \n",st+2);
}
}
int main()
{
long x,m,i,a;
ifstream f ("cautbin.in");
freopen("cautbin.out","w",stdout);
f>>n;
for (i=0;i<n;i++)
f>>s[i];
f>>m;
for (i=0;i<m;i++)
{
f>>a>>x;
if (a==0)
caut0(x);
else
if (a==1)
caut1(x);
else
caut2(x);
}
}