fork download
  1. import Control.Monad.ST
  2. import Data.Array.ST
  3. import Data.Array.Unboxed
  4.  
  5. rev :: UArray Int Int -> UArray Int Int
  6. rev ary = runSTUArray $ do
  7. ary <- thaw ary :: ST s (STUArray s Int Int)
  8. (l,r) <- getBounds ary
  9. rev' ary l r ((r - l + 1) `div` 2) 0
  10. return ary
  11. where
  12. rev' ary init end len n
  13. | n < len = do
  14. let (a,b) = (init + n, end - n)
  15. x <- readArray ary a
  16. y <- readArray ary b
  17. writeArray ary a y
  18. writeArray ary b x
  19. rev' ary init end len (n+1)
  20. | otherwise = return ()
  21.  
  22. size = 1000000
  23. main = print $ (rev $ runSTUArray $ newListArray (1, size) [1..size]) ! 1
Success #stdin #stdout 0.07s 11784KB
stdin
Standard input is empty
stdout
1000000