double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
     int m = nums1.size(), n = nums2.size();
     if ((n + m)&1)
         return findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2 + 1);
     else
         return (findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2 + 1) +
                 findKthSortedArrays(nums1.begin(), m, nums2.begin(), n, (n + m) / 2)) / 2.0;
 }
    double findKthSortedArrays(vector<int>::iterator nums1_begin, int m, vector<int>::iterator nums2_begin, int n, int k) {
        if (m < n) {
            swap(m, n);
            swap(nums1_begin, nums2_begin);
        }
        if (n == 0)
            return *(nums1_begin + k - 1);
        if (k == 1)
            return min(*nums1_begin, *nums2_begin);

        int pb = min(k / 2, n), pa = k - pb;
        if (*(nums1_begin + pa - 1) > *(nums2_begin + pb - 1))
            return findKthSortedArrays(nums1_begin, m, nums2_begin + pb, n - pb, k - pb);
        else if (*(nums1_begin + pa - 1) < *(nums2_begin + pb - 1))
            return findKthSortedArrays(nums1_begin + pa, m - pa, nums2_begin, n, k - pa);
        else
            return *(nums1_begin + pa - 1);
    }
        double findKthSortedArrays(std::vector<int>::iterator it1, int m,
                                   std::vector<int>::iterator it2, int n,
                                   int k)
        {
            if (m > n)
                return findKthSortedArrays(it2, n, it1, m, k);
            if (m == 0)
                return *(it2 + k - 1);
            if (k == 1)
                return std::min(*it1, *it2);

            int pa = std::min(k / 2, m), pb = k - pa;
            if (*(it1 + pa - 1) < *(it2 + pb - 1))
                return findKthSortedArrays(it1 + pa, m - pa, it2, n, k - pa);
            else if (*(it1 + pa - 1) > *(it2 + pb - 1))
                return findKthSortedArrays(it1, m, it2 + pb, n - pb, k - pb);
            else
                return *(it1 + pa - 1);
        }