Problem:
Doubly Linked List

Your task is to implement a double linked list.

Write a program which performs the following operations:

insert x: insert an element with key x into the front of the list.

delete x: delete the first element which has the key of x from the list. If there is not such element, you need not do anything.

deleteFirst: delete the first element from the list.

deleteLast: delete the last element from the list.

Input

The input is given in the following format:

n

command1

command2

...

commandn

In the first line, the number of operations n is given. In the following n lines, the above mentioned operations are given in the following format:

insert x

delete x

deleteFirst

deleteLast

Output

Print all the element (key) in the list after the given operations. Two consequtive keys should be separated by a single space.

Constraints

The number of operations ≤ 2,000,000

The number of delete operations ≤ 20

0 ≤ value of a key ≤ 109

The number of elements in the list does not exceed 106

For a delete, deleteFirst or deleteLast operation, there is at least one element in the list.

Sample Input 1

7
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5

Sample Output 1

6 1 2

Sample Input 2

9
insert 5
insert 2
insert 3
insert 1
delete 3
insert 6
delete 5
deleteFirst
deleteLast

Sample Output 2

1

Solution in Haskell (judge verdict: Memory Limit Exceeded)

import Control.Applicative

import Data.Foldable (toList)
import Data.Sequence (Seq)
import qualified Data.Sequence as S

removeOne :: Int -> Seq Int -> Seq Int
removeOne x seq =
  case S.viewl seq of
    S.EmptyL  -> S.empty
    s S.:< ss ->
      if x == s
         then ss
         else s S.<| (removeOne x ss)

exec :: [String] -> Seq Int -> Seq Int
exec ["insert", n]   seq = (read n) S.<| seq
exec ["delete", n]   seq = removeOne (read n) seq
exec ["deleteFirst"] seq = let (s  S.:< ss) = S.viewl seq in ss
exec ["deleteLast"]  seq = let (ss S.:>  s) = S.viewr seq in ss

printSeq :: String -> [Int] -> IO ()
printSeq _ []       = putStrLn "" >> return ()
printSeq sep (x:xs) = do
  putStr sep
  putStr $ show x
  printSeq " " xs

main :: IO ()
main = do
  n   <- read <$> getLine :: IO Int
  seq <- readCommand n S.empty
  printSeq "" (toList seq)
  where
    readCommand :: Int -> Seq Int -> IO (Seq Int)
    readCommand 0 seq = return seq
    readCommand n seq = do
      cmds <- words <$> getLine
      readCommand (n-1) (exec cmds seq)