; consecutive array search

(define (f x xs) ; unsorted
  (let loop ((xs xs))
    (cond ((or (null? xs) (null? (cdr xs))) (list))
          ((= (+ (car xs) (cadr xs)) x) (list (car xs) (cadr xs)))
          (else (loop (cdr xs))))))

(display (f 7 '(4 6 2 5 1 3 7))) (newline)
(display (f 7 '(4 6 5 1 2 3 7))) (newline)

(define (bsearch lt? x xs)
  (let loop ((lo 0) (hi (- (vector-length xs) 1)))
    (let ((mid (+ lo (quotient (- hi lo) 2))))
      (cond ((< hi lo) #f)
            ((lt? x (vector-ref xs mid)) (loop lo (- mid 1)))
            ((lt? (vector-ref xs mid) x) (loop (+ mid 1) hi))
            (else mid)))))

(define (f x xs) ; sorted
  (let ((i (bsearch < (quotient x 2) xs)))
    (if (and i (= (+ (vector-ref xs i) (vector-ref xs (+ i 1))) x))
        (list (vector-ref xs i) (vector-ref xs (+ i 1)))
        (list))))

(display (f 7 '#(1 2 3 4 5 6 7))) (newline)
(display (f 6 '#(1 2 3 4 5 6 7))) (newline)