Lisp Count Semi Primes
(defun count-semi-primes (n p q)
(let ((primes (make-array (1+ n) :initial-element t))
(semi-primes (make-array (1+ n) :initial-element 0)))
(loop for i from 2 while (<= (* i i) n)
do (when (aref primes i)
(loop for k from (* i i) to n by i
do (setf (aref primes k) nil))))
(loop for k from 2 while (<= (* k k) n)
do (when (aref primes k)
(loop for i from 2 while (<= (* i k) n)
do (when (aref primes i)
(setf (aref semi-primes (* k i)) 1)))))
(loop for i from 1 to n
do (incf (aref semi-primes i) (aref semi-primes (1- i))))
(loop for v in p
for qi in q
collect (- (aref semi-primes qi) (aref semi-primes (1- v))))))
This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.