takeUntilMax :: [Int] -> Int -> (Int, [Int])
takeUntilMax [] m = (m, [])
takeUntilMax [x] _ = (x, [x])
takeUntilMax (x:xs) m
    | x == m = (x, [x])
    | otherwise =
        let (m', xs') = takeUntilMax xs m
        in (max m' x, x:xs')

doTakeUntilMax :: [Int] -> [Int]
doTakeUntilMax l = l'
    where (m, l') = takeUntilMax l m

takeUntilMax' :: [Int] -> Int -> (Int, [Int])
takeUntilMax' [] m = (m, [])
takeUntilMax' [x] _ = (x, [x])
takeUntilMax' (x:xs) m
    | x == m = (maximum (x:xs), [x])
    | otherwise =
        let (m', xs') = takeUntilMax' xs m
        in (max m' x, x:xs')