; decreasing-increasing array

(define (split-while pred? xs)
  (let loop ((xs xs) (ys '()))
    (if (or (null? xs) (not (pred? (car xs))))
        (values (reverse ys) xs)
        (loop (cdr xs) (cons (car xs) ys)))))

(define (sorted? pred? xs)
  (cond ((or (null? xs) (null? (cdr xs))) #t)
        ((not (pred? (car xs) (cadr xs))) #f)
        (else (sorted? pred? (cdr xs)))))

(define (decr-incr xs)
  (if (< (length xs) 3) #f
    (let ((pivot (apply min xs)))
      (let-values (((decr incr)
                    (split-while (lambda (x) (not (= x pivot))) xs)))
        (if (and (not (null? decr)) (not (null? incr))
                 (sorted? <= (reverse decr)) (sorted? <= incr))
            pivot
            #f)))))

(display (decr-incr '(10 10 10 8 8 6 4 4 3 12 13 22 31 40 59 68))) (newline)
(display (decr-incr '(1 2 4 8 16 32 64))) (newline)