De ce contează?
Ai un raft de cărți așezate crescător după numărul de pe cotor și mai multe cărți au exact numărul 3. Vrei degetul tău să se oprească pe prima carte cu numărul STRICT mai mare decât 3 — adică imediat după ultimul 3. Nu cauți un 3, cauți granița unde se termină 3-urile. Exact asta face upper_bound: pe un raft ordonat, îți arată instant prima carte care a depășit valoarea ta.
Intuiția
Pe un vector sortat, valorile egale stau una lângă alta, ca un bloc. upper_bound(x) îți dă poziția primului element strict mai mare decât x — adică exact capătul din dreapta al blocului de x-uri. Fiindcă vectorul e ordonat, nu trebuie să parcurgi tot: funcția folosește căutare binară și ajunge la graniță în pași logaritmici.