| 1 | import Data.Int |
|---|
| 2 | import Data.Array.Base |
|---|
| 3 | import Data.Array.ST |
|---|
| 4 | import Control.Monad.ST |
|---|
| 5 | import System.Environment |
|---|
| 6 | |
|---|
| 7 | update :: Int -> Int -> Int |
|---|
| 8 | update orig round = orig + round |
|---|
| 9 | |
|---|
| 10 | incrArray :: STUArray s Int Int -> Int -> ST s () |
|---|
| 11 | incrArray arr round = do k <- getNumElements arr |
|---|
| 12 | spin 0 (k - 1) |
|---|
| 13 | where spin i n | i > n = return () |
|---|
| 14 | spin i n = do x <- unsafeRead arr i |
|---|
| 15 | unsafeWrite arr i $ update x round |
|---|
| 16 | spin (i + 1) n |
|---|
| 17 | |
|---|
| 18 | main :: IO () |
|---|
| 19 | main = do |
|---|
| 20 | [_nr, _len] <- getArgs |
|---|
| 21 | let nRounds = read _nr :: Int |
|---|
| 22 | len = read _len :: Int |
|---|
| 23 | loop :: STUArray s Int Int -> Int -> ST s () |
|---|
| 24 | loop arr r | r > nRounds = return () |
|---|
| 25 | loop arr r = incrArray arr r >> loop arr (r + 1) |
|---|
| 26 | stToIO $ do |
|---|
| 27 | arr <- newArray (1, len) 0 :: ST s (STUArray s Int Int) |
|---|
| 28 | loop arr 1 |
|---|