{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE BangPatterns #-} import Control.Applicative import Control.Monad import Control.Arrow import Data.List import Data.Maybe import Data.Char import qualified Data.ByteString.Char8 as B import Text.Printf import Debug.Trace import Control.Monad.ST import Data.Array.ST eratosthenes n = runST $ do isPrime <- newArray ( 0, n ) True :: ST s ( STUArray s Integer Bool ) writeArray isPrime 0 False writeArray isPrime 1 False forM_ [ 2 .. n ] $ \i -> do f <- readArray isPrime i when f $ do forM_ [ j | j <- [ 2 .. n ], i * j <= n ] $ \j -> writeArray isPrime ( i * j ) False filterM ( readArray isPrime ) [ 0 .. n ] readInt = ( readLn :: IO Int ) readInts = map ( fst . fromJust . B.readInt ) . B.words <$> B.getLine readNInts = readInt >>= flip replicateM readInt which a b f = if f then a else b mp [ a, b ] = ( a, b ) main = readLn >>= print . sum . eratosthenes