Submission #47953414


Source Code Expand

import Control.Monad
import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.List

import qualified Data.IntMap as IM
import Data.Array.IO

main :: IO ()
main = do
  [n,q] <- bsGetLnInts
  as <- bsGetLnInts
  abc330e n q as

bsGetLnInts :: IO [Int]
bsGetLnInts = unfoldr (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine

abc330e :: Int -> Int -> [Int] -> IO ()
abc330e n q as = -- snd $ mapAccumL step (arr0, mis0, mex0) ixs
  do
    arr <- newListArray (1,n) as :: IO (IOUArray Int Int)
    foldM_ (\(mis, mex) _ -> do
      [i,x] <- bsGetLnInts
      ai <- readArray arr i
      writeArray arr i x
      let mis1 = insertMIS x $ deleteMIS ai mis
      let mex1 = insertMEX x $ if memberMIS ai mis1 then mex else deleteMEX ai mex
      print $ mexMEX 0 mex1
      return (mis1, mex1)
      ) (mis0, mex0) [1..q]
  where
    mis0 = fromListMIS as
    mex0 = foldl' (flip insertMEX) IM.empty as

-- 多重集合
-- @gotoki_no_joe
type MultiIntSet = IM.IntMap Int

fromListMIS :: [Int] -> MultiIntSet
fromListMIS xs = IM.fromListWith (+) [(x, 1) | x <- xs]

insertMIS :: Int -> MultiIntSet -> MultiIntSet
insertMIS x ms = IM.insertWith (+) x 1 ms

deleteMIS :: Int -> MultiIntSet -> MultiIntSet
deleteMIS x ms = IM.update dec x ms
  where
    dec 1 = Nothing
    dec n = Just $ pred n

memberMIS :: Int -> MultiIntSet -> Bool
memberMIS x ms = IM.member x ms

-- mex
-- 含まれる整数を区間で記憶する
type MexSet = IM.IntMap Bool

insertMEX :: Int -> MexSet -> MexSet
insertMEX x ms
  | memberx = ms
  | expandLow && expandHigh = IM.delete x        $ IM.delete x1 ms
  | expandLow               = IM.insert x1 False $ IM.delete x  ms
  |              expandHigh = IM.insert x  True  $ IM.delete x1 ms
  | otherwise               = IM.insert x1 False $ IM.insert x  True ms
  where
    x1 = succ x
    low  = IM.lookupLE x ms
    high = IM.lookupGT x ms
    expandLow  = maybe False ((x  ==) . fst) low
    expandHigh = maybe False ((x1 ==) . fst) high
    memberx = maybe False snd low

mexMEX :: Int -> MexSet -> Int
mexMEX x ms =
  case IM.lookupGT x ms of
    Just (b,False) -> b
    _ -> x

deleteMEX :: Int -> MexSet -> MexSet
deleteMEX x ms
  | notmemberx = ms
  | shrinkLow && shrinkHigh = IM.delete x       $ IM.delete x1 ms
  | shrinkLow               = IM.insert x False $ IM.delete x1 ms
  |              shrinkHigh = IM.insert x1 True $ IM.delete x  ms
  | otherwise               = IM.insert x1 True $ IM.insert x False ms
  where
    x1 = succ x
    low  = IM.lookupLE x ms
    high = IM.lookupGT x ms
    shrinkLow  = maybe False ((x1 ==) . fst) high
    shrinkHigh = maybe False ((x  ==) . fst) low
    notmemberx = not $ maybe False snd low

Submission Info

Submission Time
Task E - Mex and Update
User joetheshootingst
Language Haskell (GHC 9.4.5)
Score 475
Code Size 2779 Byte
Status AC
Exec Time 1825 ms
Memory 130192 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 1
AC × 35
Set Name Test Cases
Sample sample_01.txt
All hack_01.txt, hack_02.txt, hack_03.txt, hack_04.txt, sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt
Case Name Status Exec Time Memory
hack_01.txt AC 474 ms 76928 KiB
hack_02.txt AC 474 ms 75984 KiB
hack_03.txt AC 464 ms 75960 KiB
hack_04.txt AC 464 ms 75996 KiB
sample_01.txt AC 1 ms 6720 KiB
test_01.txt AC 1 ms 6912 KiB
test_02.txt AC 1 ms 7024 KiB
test_03.txt AC 112 ms 39448 KiB
test_04.txt AC 142 ms 37892 KiB
test_05.txt AC 232 ms 33864 KiB
test_06.txt AC 863 ms 66492 KiB
test_07.txt AC 1825 ms 130176 KiB
test_08.txt AC 152 ms 34952 KiB
test_09.txt AC 302 ms 35784 KiB
test_10.txt AC 1274 ms 80036 KiB
test_11.txt AC 1825 ms 130192 KiB
test_12.txt AC 474 ms 75720 KiB
test_13.txt AC 614 ms 75884 KiB
test_14.txt AC 914 ms 75980 KiB
test_15.txt AC 914 ms 75828 KiB
test_16.txt AC 1124 ms 99400 KiB
test_17.txt AC 504 ms 75956 KiB
test_18.txt AC 1214 ms 76964 KiB
test_19.txt AC 1194 ms 76976 KiB
test_20.txt AC 1645 ms 113804 KiB
test_21.txt AC 1054 ms 82532 KiB
test_22.txt AC 1064 ms 75712 KiB
test_23.txt AC 1054 ms 75996 KiB
test_24.txt AC 1074 ms 75960 KiB
test_25.txt AC 1054 ms 76960 KiB
test_26.txt AC 122 ms 45524 KiB
test_27.txt AC 914 ms 76928 KiB
test_28.txt AC 834 ms 75824 KiB
test_29.txt AC 162 ms 47340 KiB
test_30.txt AC 964 ms 76764 KiB