# your code goes here
import sys
import math
def simple_sieve(limit):
is_prime = [True] * (limit + 1)
is_prime[0:2] = [False, False]
for i in range(2, int(limit**0.5) + 1):
if is_prime[i]:
for j in range(i*i, limit + 1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
def segmented_sieve(m, n, base_primes):
is_prime = [True] * (n - m + 1)
for p in base_primes:
start = max(p * p, ((m + p - 1) // p) * p) # first multiple of p in range [m, n]
for j in range(start, n + 1, p):
is_prime[j - m] = False
# Special case: if m == 1, mark 1 as not prime
if m == 1:
is_prime[0] = False
return [i + m for i, prime in enumerate(is_prime) if prime]
def main():
t = int(sys.stdin.readline())
ranges = [tuple(map(int, sys.stdin.readline().split())) for _ in range(t)]
# We only need primes up to sqrt(10^9) = 31622
base_primes = simple_sieve(31623)
for idx, (m, n) in enumerate(ranges):
primes_in_range = segmented_sieve(m, n, base_primes)
print("\n".join(map(str, primes_in_range)))
if idx != t - 1:
print() # blank line between test cases
if __name__ == "__main__":
main()
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCmltcG9ydCBzeXMKaW1wb3J0IG1hdGgKCmRlZiBzaW1wbGVfc2lldmUobGltaXQpOgogICAgaXNfcHJpbWUgPSBbVHJ1ZV0gKiAobGltaXQgKyAxKQogICAgaXNfcHJpbWVbMDoyXSA9IFtGYWxzZSwgRmFsc2VdCiAgICBmb3IgaSBpbiByYW5nZSgyLCBpbnQobGltaXQqKjAuNSkgKyAxKToKICAgICAgICBpZiBpc19wcmltZVtpXToKICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSppLCBsaW1pdCArIDEsIGkpOgogICAgICAgICAgICAgICAgaXNfcHJpbWVbal0gPSBGYWxzZQogICAgcmV0dXJuIFtpIGZvciBpLCBwcmltZSBpbiBlbnVtZXJhdGUoaXNfcHJpbWUpIGlmIHByaW1lXQoKZGVmIHNlZ21lbnRlZF9zaWV2ZShtLCBuLCBiYXNlX3ByaW1lcyk6CiAgICBpc19wcmltZSA9IFtUcnVlXSAqIChuIC0gbSArIDEpCgogICAgZm9yIHAgaW4gYmFzZV9wcmltZXM6CiAgICAgICAgc3RhcnQgPSBtYXgocCAqIHAsICgobSArIHAgLSAxKSAvLyBwKSAqIHApICAjIGZpcnN0IG11bHRpcGxlIG9mIHAgaW4gcmFuZ2UgW20sIG5dCiAgICAgICAgZm9yIGogaW4gcmFuZ2Uoc3RhcnQsIG4gKyAxLCBwKToKICAgICAgICAgICAgaXNfcHJpbWVbaiAtIG1dID0gRmFsc2UKCiAgICAjIFNwZWNpYWwgY2FzZTogaWYgbSA9PSAxLCBtYXJrIDEgYXMgbm90IHByaW1lCiAgICBpZiBtID09IDE6CiAgICAgICAgaXNfcHJpbWVbMF0gPSBGYWxzZQoKICAgIHJldHVybiBbaSArIG0gZm9yIGksIHByaW1lIGluIGVudW1lcmF0ZShpc19wcmltZSkgaWYgcHJpbWVdCgpkZWYgbWFpbigpOgogICAgdCA9IGludChzeXMuc3RkaW4ucmVhZGxpbmUoKSkKICAgIHJhbmdlcyA9IFt0dXBsZShtYXAoaW50LCBzeXMuc3RkaW4ucmVhZGxpbmUoKS5zcGxpdCgpKSkgZm9yIF8gaW4gcmFuZ2UodCldCgogICAgIyBXZSBvbmx5IG5lZWQgcHJpbWVzIHVwIHRvIHNxcnQoMTBeOSkgPSAzMTYyMgogICAgYmFzZV9wcmltZXMgPSBzaW1wbGVfc2lldmUoMzE2MjMpCgogICAgZm9yIGlkeCwgKG0sIG4pIGluIGVudW1lcmF0ZShyYW5nZXMpOgogICAgICAgIHByaW1lc19pbl9yYW5nZSA9IHNlZ21lbnRlZF9zaWV2ZShtLCBuLCBiYXNlX3ByaW1lcykKICAgICAgICBwcmludCgiXG4iLmpvaW4obWFwKHN0ciwgcHJpbWVzX2luX3JhbmdlKSkpCiAgICAgICAgaWYgaWR4ICE9IHQgLSAxOgogICAgICAgICAgICBwcmludCgpICAjIGJsYW5rIGxpbmUgYmV0d2VlbiB0ZXN0IGNhc2VzCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==