; search in an ascending matrix
(define (matrix-rows x) (vector-length x))
(define (matrix-cols x) (vector-length (vector-ref x 0)))
(define (matrix-ref m i j) (vector-ref (vector-ref m i) j))
(define m (vector #(1 5 7 9) #(4 6 10 15) #(8 11 12 19) #(14 16 18 21)))
(define (search m k)
(let ((max-r (- (matrix-rows m) 1)) (max-c (- (matrix-cols m) 1)))
(let loop ((r 0) (c max-c))
(cond ((or (negative? c) (< max-r r)) #f)
((< k (matrix-ref m r c)) (loop r (- c 1)))
((< (matrix-ref m r c) k) (loop (+ r 1) c))
(else (values r c))))))
(call-with-values
(lambda () (search m 11))
(lambda (r c)
(display r) (newline)
(display c) (newline)))
(display (search m 13)) (newline)