#include <stdint.h>
#include <limits.h>
#include <numeric>
#include <vector>
#include <queue>
#include "locmin.h"

std::pair<int, int> find_locmin_point(int N, int M) {
    std::vector<long long> values(N * M, 0);
    const auto v = [N, M, &values] (int r, int c) {
        if (r < 0 || c < 0 || r >= N || c >= M) return LLONG_MAX;
        if (values[r * M + c] == 0) values[r * M + c] = value(r + 1, c + 1);
        return values[r * M + c];
    };

    int r = N / 2, c = M / 2;
    while (true) {
        long long n = v(r - 1, c);
        long long w = v(r, c - 1);
        long long s = v(r + 1, c);
        long long e = v(r, c + 1);
        long long x = v(r, c);
        long long t = std::min(std::min(std::min(n, e), std::min(s, w)), x);
        if (t == n) r--;
        else if (t == w) c--;
        else if (t == s) r++;
        else if (t == e) c++;
        else return  { r + 1, c + 1 };
//        if (v(r - 1, c) < v(r, c)) r--;
//        else if (v(r, c - 1) < v(r, c)) c--;
//        else if (v(r + 1, c) < v(r, c)) r++;
//        else if (v(r, c + 1) < v(r, c)) c++;
//        else return { r + 1, c + 1 };
    }
}
