int szukana(int poc,int kon,int x)
{
int sr;
while(poc<=kon)
{
sr=(poc+kon)/2;
if(to[sr]<x)
{
poc=sr+1;
x=sr+1;
return x;
}
else
kon=sr-1;
}
}
Przerywasz wyszukiwanie binarne w miejscu, gdzie powinno być kontynuowane, trzeba przenieść return na koniec funkcji.
Co do upper_bounda i lower_bounda, to przydają się rzadko, jeżeli nie mamy vectora po którym możemy wyszukiwać binarnie to są bezużyteczne (tak się dzieje, gdy np. wyszukujemy po liczbach rzeczywistych). Dobra wiadomość jest taka, że samo wyszukiwanie binarne można napisać w trzech linijkach kodu trochę niekonwencjonalnie:
for ( int c = tab.size(); c >= 1; c /= 2)
while ( lo + c < tab.size() && tab[lo + c] <= p )
lo += c;
'tab' w tym przykladzie to twoje 'to', 'p' to 'x', zmienna 'c' reprezentuje coraz mniejsze skoki o ktore probujemy powiekszyc 'lo' - czyli wynik naszego wyszukiwania.