rev ary = do
(l,r) <- getBounds ary
rev' ary l r ((r - l + 1) `div` 2) 0
return ()
where
| n < len = do
let (a
,b
) = (init + n
, end
- n
) x <- readArray ary a
y <- readArray ary b
writeArray ary a y
writeArray ary b x
rev' ary init end len (n+1)
| otherwise = return ()
size = 1000000
main = do
ary <- newListArray (1, size) [1..size] :: IO (IOUArray Int Int)
rev ary
print =<< readArray ary 1
aW1wb3J0IERhdGEuQXJyYXkuSU8KCnJldiA6OiBJT1VBcnJheSBJbnQgSW50IC0+IElPICgpCnJldiBhcnkgPSBkbwogIChsLHIpIDwtIGdldEJvdW5kcyBhcnkKICByZXYnIGFyeSBsIHIgKChyIC0gbCArIDEpIGBkaXZgIDIpIDAKICByZXR1cm4gKCkKICB3aGVyZQogICAgcmV2JyBhcnkgaW5pdCBlbmQgbGVuIG4KICAgICAgfCBuIDwgbGVuID0gZG8KICAgICAgICAgIGxldCAoYSxiKSA9IChpbml0ICsgbiwgZW5kIC0gbikKICAgICAgICAgIHggPC0gcmVhZEFycmF5IGFyeSBhCiAgICAgICAgICB5IDwtIHJlYWRBcnJheSBhcnkgYgogICAgICAgICAgd3JpdGVBcnJheSBhcnkgYSB5CiAgICAgICAgICB3cml0ZUFycmF5IGFyeSBiIHgKICAgICAgICAgIHJldicgYXJ5IGluaXQgZW5kIGxlbiAobisxKQogICAgICB8IG90aGVyd2lzZSA9IHJldHVybiAoKQoKc2l6ZSA9IDEwMDAwMDAKbWFpbiA9IGRvCiAgYXJ5IDwtIG5ld0xpc3RBcnJheSAoMSwgc2l6ZSkgWzEuLnNpemVdIDo6IElPIChJT1VBcnJheSBJbnQgSW50KQogIHJldiBhcnkKICBwcmludCA9PDwgcmVhZEFycmF5IGFyeSAx