Go Count Semi Primes
func countSemiPrimes(n int, p, q []int) []int {
	primes := make([]bool, n+1)
	for i := range primes {
		primes[i] = true
	}
	semiPrimes := make([]int, n+1)
	result := make([]int, len(p))

	for i := 2; i*i <= n; i++ {
		if primes[i] {
			for k := i * i; k <= n; k += i {
				primes[k] = false
			}
		}
	}

	for k := 2; k*k <= n; k++ {
		if primes[k] {
			for i := 2; i*k <= n; i++ {
				if primes[i] {
					semiPrimes[k*i] = 1
				}
			}
		}
	}

	for i := 1; i <= n; i++ {
		semiPrimes[i] += semiPrimes[i-1]
	}

	for k := range p {
		result[k] = semiPrimes[q[k]] - semiPrimes[p[k]-1]
	}

	return result
}

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

Haskell Count Semi Primes
import Control.Monad (forM_, when)
import Control.Monad.ST (runST)
import Data.Array (Array, listArray, (!))
import Data.Array.ST (newArray, readArray, runSTUArray, writeArray)
import Data.Array.Unboxed (UArray)

isPrimeArr :: Int -> UArray Int Bool
isPrimeArr n = runSTUArray $ do
  arr <- newArray (0, n) True
  forM_ [2 .. floor (sqrt (fromIntegral n :: Double))] $ \i -> do
    p <- readArray arr i
    when p $ forM_ [i * i, i * i + i .. n] $ \k -> writeArray arr k False
  return arr

semiPrimeArr :: Int -> UArray Int Bool -> UArray Int Bool
semiPrimeArr n primes = runSTUArray $ do
  arr <- newArray (0, n) False
  forM_ [k | k <- [2 .. floor (sqrt (fromIntegral n :: Double))], primes ! k] $ \k ->
    forM_ (takeWhile (\i -> i * k <= n) [2 ..]) $ \i ->
      when (primes ! i) $ writeArray arr (k * i) True
  return arr

prefixCounts :: Int -> UArray Int Bool -> Array Int Int
prefixCounts n semi =
  listArray (0, n) (scanl1 (+) (0 : [if semi ! i then 1 else 0 | i <- [1 .. n]]))

countSemiPrimes :: Int -> [Int] -> [Int] -> [Int]
countSemiPrimes n p q = [prefix ! qi - prefix ! (pi' - 1) | (pi', qi) <- zip p q]
  where
    primes = isPrimeArr n
    semi   = semiPrimeArr n primes
    prefix = prefixCounts n semi

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

Java Count Semi Primes
import java.util.Arrays;

public class Solution {
    public static int[] countSemiPrimes(int n, int[] p, int[] q) {
        boolean[] primes = new boolean[n + 1];
        Arrays.fill(primes, true);
        int[] semiPrimes = new int[n + 1];
        int[] semiPrimeCounts = new int[p.length];

        for (int i = 2; (long) i * i <= n; i++) {
            if (primes[i]) {
                for (int k = i * i; k <= n; k += i) {
                    primes[k] = false;
                }
            }
        }

        for (int k = 2; (long) k * k <= n; k++) {
            if (primes[k]) {
                for (int i = 2; i * k <= n; i++) {
                    if (primes[i]) {
                        semiPrimes[k * i] = 1;
                    }
                }
            }
        }

        for (int i = 1; i <= n; i++) {
            semiPrimes[i] += semiPrimes[i - 1];
        }

        for (int k = 0; k < p.length; k++) {
            semiPrimeCounts[k] = semiPrimes[q[k]] - semiPrimes[p[k] - 1];
        }

        return semiPrimeCounts;
    }
}

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

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.

PHP Count Semi Primes
function countSemiPrimes(int $n, array $p, array $q): array
{
    $primes          = array_fill(0, $n + 1, true);
    $semiPrimes      = array_fill(0, $n + 1, 0);
    $semiPrimeCounts = array_fill(0, count($p), 0);

    for ($i = 2; $i * $i <= $n; $i++) {
        if ($primes[$i]) {
            for ($k = $i * $i; $k <= $n; $k += $i) {
                $primes[$k] = false;
            }
        }
    }

    for ($k = 2; $k * $k <= $n; $k++) {
        if ($primes[$k]) {
            for ($i = 2; $i * $k <= $n; $i++) {
                if ($primes[$i]) {
                    $semiPrimes[$k * $i] = 1;
                }
            }
        }
    }

    for ($i = 1; $i <= $n; $i++) {
        $semiPrimes[$i] += $semiPrimes[$i - 1];
    }

    foreach ($p as $k => $v) {
        $semiPrimeCounts[$k] = $semiPrimes[$q[$k]] - $semiPrimes[$v - 1];

    }

    return $semiPrimeCounts;


}

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

Python Count Semi Primes
def count_semi_primes(n: int, p: list[int], q: list[int]) -> list[int]:
    primes = [True] * (n + 1)
    semi_primes = [0] * (n + 1)

    i = 2
    while i * i <= n:
        if primes[i]:
            for k in range(i * i, n + 1, i):
                primes[k] = False
        i += 1

    k = 2
    while k * k <= n:
        if primes[k]:
            i = 2
            while i * k <= n:
                if primes[i]:
                    semi_primes[k * i] = 1
                i += 1
        k += 1

    for i in range(1, n + 1):
        semi_primes[i] += semi_primes[i - 1]

    return [semi_primes[q[idx]] - semi_primes[p[idx] - 1] for idx in range(len(p))]

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

Rust Count Semi Primes
fn count_semi_primes(n: usize, p: &[usize], q: &[usize]) -> Vec<i64> {
    let mut is_prime = vec![true; n + 1];
    let mut semi_primes = vec![0i64; n + 1];

    let mut i = 2;
    while i * i <= n {
        if is_prime[i] {
            let mut k = i * i;
            while k <= n {
                is_prime[k] = false;
                k += i;
            }
        }
        i += 1;
    }

    let mut k = 2;
    while k * k <= n {
        if is_prime[k] {
            let mut i = 2;
            while i * k <= n {
                if is_prime[i] {
                    semi_primes[k * i] = 1;
                }
                i += 1;
            }
        }
        k += 1;
    }

    for i in 1..=n {
        semi_primes[i] += semi_primes[i - 1];
    }

    p.iter()
        .zip(q.iter())
        .map(|(&pi, &qi)| semi_primes[qi] - semi_primes[pi - 1])
        .collect()
}

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

TypeScript Count Semi Primes
function countSemiPrimes(n: number, p: number[], q: number[]): number[] {
  const primes: boolean[] = new Array(n + 1).fill(true);
  const semiPrimes: number[] = new Array(n + 1).fill(0);
  const semiPrimeCounts: number[] = new Array(p.length).fill(0);

  for (let i = 2; i * i <= n; i++) {
    if (primes[i]) {
      for (let k = i * i; k <= n; k += i) {
        primes[k] = false;
      }
    }
  }

  for (let k = 2; k * k <= n; k++) {
    if (primes[k]) {
      for (let i = 2; i * k <= n; i++) {
        if (primes[i]) {
          semiPrimes[k * i] = 1;
        }
      }
    }
  }

  for (let i = 1; i <= n; i++) {
    semiPrimes[i] += semiPrimes[i - 1];
  }

  for (let k = 0; k < p.length; k++) {
    semiPrimeCounts[k] = semiPrimes[q[k]] - semiPrimes[p[k] - 1];
  }

  return semiPrimeCounts;
}

This precomputes semiprimes and prefix sums so each range query becomes a quick subtraction.

Bash Cyclic Rotation
cyclic_rotation() {
    local -n _a="$1"
    local -n _out="$2"
    local _k=$3
    local _size=${#_a[@]}
    if (( _size == 0 )); then
        _out=()
        return
    fi
    _k=$(( _k % _size ))
    _out=()
    local _i
    for ((_i = 0; _i < _size; _i++)); do
        _out[(_i + _k) % _size]=${_a[_i]}
    done
}

This rotates the array to the right by K steps and keeps the wrap-around values in the correct order.

C++ Cyclic Rotation
#include <vector>

std::vector<int> cyclicRotation(std::vector<int> a, int k)
{
    if (!a.empty()) {
        for (int i = 0; i < k; ++i) {
            int back = a.back();
            a.pop_back();
            a.insert(a.begin(), back);
        }
    }

    return a;
}

This rotates the array to the right by K steps and keeps the wrap-around values in the correct order.