Cod sursa(job #2533727)
Utilizator | Data | 29 ianuarie 2020 17:15:43 | |
---|---|---|---|
Problema | Cautare binara | Scor | 0 |
Compilator | cpp-32 | Status | done |
Runda | Arhiva educationala | Marime | 3.07 kb |
#include <iostream>
#include <fstream>
/** 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 */
using namespace std;
ifstream f("cautabin.in");
ofstream g("cautabin.out");
int main()
{
int N, M, x, i, p, q, ok, optiune, mij;
f>>N;
int v[N];
for(i=1; i<=N; ++i)
f>>v[i];
f>>M;
for(i=1; i<=M; ++i)
{
f>>optiune>>x;
ok=0;
switch(optiune)
{
case 0:
{
p=1;
q=N;
while(p<=q && ok==0)
{
mij=(p+q)/2;
if(v[mij]==x)
{
while(v[mij+1]==x)
mij++;
ok=1;
break;
}
if(x<v[mij])
q=mij-1;
else p=mij+1;
}
if(ok==1)
g<<mij<<'\n';
else g<<-1<<'\n';
}
case 1:
while(ok==0)
{
p=1;
q=N;
ok=0;
while(p<=q && ok==0)
{
mij=(p+q)/2;
if(v[mij]==x)
{
while(v[mij+1]==x)
mij++;
ok=1;
break;
}
if(x<v[mij])
q=mij-1;
else p=mij+1;
}
if(ok==1)
g<<mij<<'\n';
else x--;
}
case 2:
while(ok==0)
{
p=1;
q=N;
ok=0;
while(p<=q && ok==0)
{
mij=(p+q)/2;
if(v[mij]==x)
{
while(v[mij-1]==x)
mij--;
ok=1;
break;
}
if(x<v[mij])
q=mij-1;
else p=mij+1;
}
if(ok==1)
g<<mij<<'\n';
else x++;
}
}
}
return 0;
}