Haskell Frog River One
import qualified Data.Set as Set
frogRiverOne :: Int -> [Int] -> Int
frogRiverOne x a = go (zip [0 ..] a) Set.empty
where
go [] _ = -1
go ((k, i) : rest) seen
| i <= x && not (Set.member i seen) =
let seen' = Set.insert i seen
in if Set.size seen' == x then k else go rest seen'
| otherwise = go rest seen
This tracks the earliest time each needed position appears and stops as soon as the frog can cross.