koala, тут треба мiркувати. По формi менi ваш алгоритм до вподоби. Двовимiрне поле пошуку - двовимiрна рекурсiя. 
Але я хочу повернутися до попереднього питання. Я вчора (та й сьогоднi) вже трохи втомлений. Тому даруйте менi певну недбалiсть у кодi що буде далi. Але спочатку мої аргументи. Я дарма згодився з вашими, останнього разу. Ви казали що виконуватиметься лише одна гiлка if. А це не так. I саме тому, що логiчнi вирази у першому if в данному випадку мають бути виконани всi. Бо логiчне або не припине перевiрку пiсля першого false. Тож у навiть половинi випадкiв буде 3 виклика, а у найгiршому, - 4.
Ще гiрше те, що основання логарифму значно блище до 1 анiж 2...
Менi дуже шкода. Правда. Єдина надiя, що я десь помилився:
#include <iostream>
#include <algorithm>
#include <random>
#include <chrono>
template<typename It>
void uniform_random_fill(int num_min, int num_max, It first, It last) {
    std::random_device r;
    std::mt19937 g(r());
    std::uniform_int_distribution<int> ud(num_min, num_max);
    while(first != last) *first++ = ud(g);
}
std::vector<int> make_source_vector(int num_min, int num_max, unsigned v_size) {
    std::vector<int> vec(v_size);
    uniform_random_fill(num_min, num_max, vec.begin(), vec.end());
    return vec;
}
std::vector<std::vector<int>> make_matrix(int num_min, int num_max, unsigned v_size) {    
    std::vector<std::vector<int>> matrix;
    auto vec = make_source_vector(num_min, num_max, v_size);
    for(int el : vec) {
        for(int &el : vec) el += 1;
        std::sort(vec.begin(), vec.end());
        matrix.push_back(vec);
    }
    return matrix;
}
void print_matrix(std::vector<std::vector<int>> const &v) {
    for(const auto &el : v) {
        for(const int in : el)
            std::cout << in << ' ';
        std::cout << '\n';
    }
    std::cout << '\n';
}
struct simple_timer {
    ~simple_timer() {
        std::chrono::duration<double> dur = std::chrono::steady_clock::now() - begin;
        std::cout << "\nThe time span was: " << dur.count() << "\n";
    }
    std::chrono::time_point<std::chrono::steady_clock> begin =
        std::chrono::steady_clock::now();
};
template<typename T>
// std::pair<int, int>
bool find_in_matrix(
    const std::vector<std::vector<T>> &matrix,
    const T &target
) {
    int row_ind(0);
    for(const auto &vec : matrix) {
        if(vec.front() <= target && vec.back() >= target) {
            auto it = std::lower_bound(vec.begin(), vec.end(), target);
                if(*it == target) {
                    return true;
                    // { row_ind, it - vec.begin() };
                }
        }
        ++row_ind;
    }
    return false;
    // { -1, -1 };
}
class Solution {
public:
    using Matrix = std::vector<std::vector<int>>;
    bool searchMatrix(const Matrix &matrix, int target) {
        return searchMatrix(matrix, target, 0, matrix[0].size(), 0, matrix.size());
    }
    bool searchMatrix(const Matrix &matrix, int target, int x0, int x1, int y0, int y1) {
        if(x1 == x0 || y1 == y0)
            return false;
        if(x1 - x0 == 1 && y1 - y0 == 1)
            return matrix[y0][x0] == target;
        int xmid = (x0 + x1) / 2;
        int ymid = (y0 + y1) / 2;
        if(matrix[ymid][xmid] == target)
            return true;
        else if(matrix[ymid][xmid] > target)
            return searchMatrix(matrix, target, x0, xmid, ymid, y1)
                || searchMatrix(matrix, target, x0, x1, y0, ymid);
        else
            return searchMatrix(matrix, target, x0, xmid + 1, ymid + 1, y1)
                || searchMatrix(matrix, target, xmid + 1, x1, y0, y1);
    }
};
const int num_min = 0;
const int num_max = 10;
const int v_size = 1000; // 10
const int search_number = 10000; // 5
int main() {
    std::vector<std::vector<int>>
    matrix(make_matrix(num_min, num_max, v_size));
    std::vector<int> vtargets=make_source_vector(num_min, 2*num_max, search_number);
    std::cout << "\nfind_in_matrix\n";
    {
        simple_timer st;
        for(auto target : vtargets) {
            bool res=find_in_matrix(matrix, target);
            // cout << res << '\n';
        }
    }
    std::cout << "\nSolution\n";
    Solution sol;
    {
        simple_timer st;
        for(auto target : vtargets) {
            bool res = sol.searchMatrix(matrix, target);
            // cout << res << '\n';
        }
    }
    return 0;
}
Даруйте що не вiдформатував i може десь залишилося трохи робочого смiття. I за те що багатенько слiв, але ужати поки не вийшло.