import Data.Array.ST
import Data.Array.Unboxed
rev ary = runSTUArray $ do
ary
<- thaw ary
:: ST s
(STUArray s
Int Int) (l,r) <- getBounds ary
rev' ary l r ((r - l + 1) `div` 2) 0
return ary
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 = print $ (rev $ runSTUArray $ newListArray (1, size) [1..size]) ! 1
aW1wb3J0IENvbnRyb2wuTW9uYWQuU1QKaW1wb3J0IERhdGEuQXJyYXkuU1QKaW1wb3J0IERhdGEuQXJyYXkuVW5ib3hlZAoKcmV2IDo6ICBVQXJyYXkgSW50IEludCAtPiBVQXJyYXkgSW50IEludApyZXYgYXJ5ID0gcnVuU1RVQXJyYXkgJCBkbwogIGFyeSA8LSB0aGF3IGFyeSA6OiBTVCBzIChTVFVBcnJheSBzIEludCBJbnQpCiAgKGwscikgPC0gZ2V0Qm91bmRzIGFyeQogIHJldicgYXJ5IGwgciAoKHIgLSBsICsgMSkgYGRpdmAgMikgMAogIHJldHVybiBhcnkKICB3aGVyZQogICAgcmV2JyBhcnkgaW5pdCBlbmQgbGVuIG4KICAgICAgfCBuIDwgbGVuID0gZG8KICAgICAgICAgIGxldCAoYSxiKSA9IChpbml0ICsgbiwgZW5kIC0gbikKICAgICAgICAgIHggPC0gcmVhZEFycmF5IGFyeSBhCiAgICAgICAgICB5IDwtIHJlYWRBcnJheSBhcnkgYgogICAgICAgICAgd3JpdGVBcnJheSBhcnkgYSB5CiAgICAgICAgICB3cml0ZUFycmF5IGFyeSBiIHgKICAgICAgICAgIHJldicgYXJ5IGluaXQgZW5kIGxlbiAobisxKQogICAgICB8IG90aGVyd2lzZSA9IHJldHVybiAoKQoKc2l6ZSA9IDEwMDAwMDAKbWFpbiA9IHByaW50ICQgKHJldiAkIHJ1blNUVUFycmF5ICQgbmV3TGlzdEFycmF5ICgxLCBzaXplKSBbMS4uc2l6ZV0pICEgMQ==