I think I'm losing my mind here.
I tried this first:
import math
def BinarySearch(l, r, x):
global prime
mij = (l + r) / 2
if prime[mij] == x: return true
elif l > r : return false
elif prime[mij] > x : return BinarySearch(l, mij - 1, x)
else : return BinarySearch(mij + 1, r, x)
casesNo = int(raw_input())
prim = [1] * 10001
for i in range(2, 10000):
if prim[i]:
y = 2 * i
while (y <= 10000):
prim[y] = 0
y +=i
prime = []
for i in range(2, 10000):
if prim[i]:
prime += [i]
lng = len(prime)
while casesNo:
interval = raw_input()
i = interval.index(" ")
a = int(interval[:i])
a = max(a, 2)
b = int(interval[i:])
casesNo -= 1
for x in range(a, b+1):
if x > 10000:
squareRoot = int(math.sqrt(x))
for y in range(0,len(prime)):
if prime[y] > squareRoot: break
if x % prime[y] == 0: break
if y + 1 == len(prime) or prime[y] > squareRoot:
print x
else:
if BinarySearch(0, len(prime),x): print x
But It TLEed on me.
Then I even replaced erathosthene's with an actual list of prime constants, up to 50000!!!
Still TLE ... 
How did you people managed this one?