Faktycznie, daje się zauważyć 
Czytałeś mój dopisek do twojego wątku: Cwany Lutek? Jeżeli nie to polecam 
To zadanie też może być takim przykładem, że przyśpieszeniem wczytywania nic nie wskórasz.
Nawiasem mówiąc instrukcja:
nic nie ma wspólnego ze scanf/printf, więc lepiej jej nie stosować. Dotyczy ona tylko cin/cout/cerr, pod warunkiem, że jednoczenie nie korzystasz z printf i scanf.
Twoje sito ma mały błąd, liczba 1 jest liczbą pierwszą? Ale to oczywiście nie powód TLE.
Tle powoduje wielokrotne "przebieganie" tablicy i zliczanie liczb pierwszych. Czy można inaczej?
Zobacz, twoja tablica bool wygląda jakoś tak - piszę z pamięci, więc mogłem się pomylić:
000010101110101110101110
a gdyby od razu policzyć i zapisać ilość zer, liczb pierwszych [po poprawieniu twojego sita]:
001223344445566667788889 itd
012345678901234567890123 <-- to są indeksy do tablicy int
Gdy masz taką tablicę od razu możesz odpowiedzieć, w zakresie od zera do np 23 jest 9 liczb pierwszych.
A w zakresie 6 23 zapytasz? Tyle samo co wyżej - 9 ale trzeba odjąć dolny zakres - 1, czyli 9 - 3
PS
Twój program dla zakresu 0 23 wypisuje więcej - wlicza 0 i 1 jako liczby pierwsze.
PS 2
Możesz tak zmodyfikować swoje sito, rezygnując z tablicy bool na rzecz int, aby od razu zapisywać ilość liczb pierwszych, ale wtedy dodatkowo trzeba policzyć powyżej magicznej granicy i*i, ale na początek lepiej zrób to "tradycyjnie".