{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UnboxedTuples #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE MultiWayIf #-} import Control.Monad import Control.Monad.ST import Control.Monad.State import Control.Monad.Primitive import Control.Applicative import Control.Arrow import Data.List import Data.Array import Data.Array.IO import Data.Array.ST import Data.IORef import Data.STRef import Data.Maybe import Data.Bits import Data.Ord import Data.Ratio import Data.Int import Data.Char import qualified Data.ByteString.Char8 as BS import qualified Data.Set as Set import qualified Data.Vector as V import qualified Data.Vector.Mutable as VM import qualified Data.Vector.Unboxed as VU import qualified Data.Vector.Unboxed.Mutable as VUM import qualified Data.Vector.Generic as VG import qualified Data.Vector.Generic.Mutable as VGM import Data.Tuple import Data.Function import Text.Printf import Debug.Trace import Numeric modifyArray arr i f = readArray arr i >>= \x -> writeArray arr i (f x) listToTuple2 [a,b] = (a,b) listToTuple3 [a,b,c] = (a,b,c) listToTuple4 [a,b,c,d] = (a,b,c,d) listToTuple5 [a,b,c,d,e] = (a,b,c,d,e) readIntBS = fst . fromJust . BS.readInt for = flip map infixr 1 ? (?) :: Bool -> (a,a) -> a (?) b t = (if b then fst else snd) t main :: IO () main = do n <- readLn :: IO Int as <- map readIntBS . BS.words <$> BS.getLine :: IO [Int] let xs = (groupBy ((==) `on` fst) . sort . (flip zip) [0..]) as inf = maxBound :: Int f x y = if x == inf then y else x bs <- newLazySegmentTree n inf f :: IO (IOULazySegmentTree Int) forM_ xs $ \x -> do let (a,i) = head x (_,j) = last x modifyLazySegmentTree bs i (j+1) (const a) putStrLn =<< unwords . map show <$> (forM [0..n-1] $ \i -> findLazySegmentTree bs i) {-- 範囲更新・点取得のセグメント木--} type MLazySegmentTree v s a = (v s a, a, (a -> a -> a)) -- (セグメント木, 単位元, 二項演算) type STLazySegmentTree s a = MLazySegmentTree VM.MVector s a type IOLazySegmentTree a = STLazySegmentTree RealWorld a type STULazySegmentTree s a = MLazySegmentTree VUM.MVector s a type IOULazySegmentTree a = STULazySegmentTree RealWorld a newLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => Int -> a -> (a -> a -> a) -> m (MLazySegmentTree v (PrimState m) a) newLazySegmentTree n e f = return . (,e,f) =<< VGM.replicate m e where m = 2 * (2 ^ (ceiling $ logBase 2 (fromIntegral n))) - 1 modifyLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => MLazySegmentTree v (PrimState m) a -> Int -> Int -> (a -> a) -> m () modifyLazySegmentTree (tree,e,f) x y g = do aux 0 0 n where n = (VGM.length tree) `div` 2 + 1 aux i l r | r <= x || y <= l = return () | x <= l && r <= y = VGM.read tree i >>= \a -> VGM.write tree i (g a) | otherwise = propag i >> aux (i*2+1) l ((l+r)`div`2) >> aux (i*2+2) ((l+r)`div`2) r propag i = do a <- VGM.read tree i when (i>= \b -> VGM.write tree (i*2+1) (f a b) VGM.read tree (i*2+2) >>= \b -> VGM.write tree (i*2+2) (f a b) VGM.write tree i e findLazySegmentTree :: (PrimMonad m, VGM.MVector v a) => MLazySegmentTree v (PrimState m) a -> Int -> m a findLazySegmentTree (tree,e,f) i = do aux ((j-1)`div`2) VGM.read tree j where n = (VGM.length tree + 1) `div` 2 j = i + n - 1 aux x = do when (x >= 0) $ do aux ((x-1)`div`2) propag x propag i = do a <- VGM.read tree i when (i < n-1) $ do VGM.read tree (i*2+1) >>= \b -> VGM.write tree (i*2+1) (f a b) VGM.read tree (i*2+2) >>= \b -> VGM.write tree (i*2+2) (f a b) VGM.write tree i e