class Solution {
public:
    /**
     * find median in two sorted array
     * @param arr1 int整型vector the array1
     * @param arr2 int整型vector the array2
     * @return int整型
     */
    int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
        // write code here
        if(arr1.size() == 1) return min(arr1[0], arr2[0]); // 特判
        int n = arr1.size(); // 记录一下递增序列的长度
        int l1 = 0, r1 = n - 1, l2 = 0, r2 = n - 1; // 记录一下两个序列的左右端点
        int mid1 = 0, mid2 = 0, even = 0; // 记录两个序列的中点、以及序列长度是否为奇偶数
        while(l1 < r1) {
            even = (r1 - l1) % 2; // arr1长度为奇数even数值为0,为偶数数值为1
            mid1 = (l1 + r1) / 2;
            mid2 = (l2 + r2) / 2;
            if(arr1[mid1] == arr2[mid2]) return arr1[mid1]; // 当两个序列的中位数相等,返回中位数
            else if(arr1[mid1] < arr2[mid2]) { // 当出现不等情况,取较小区间的右半部分和较大区间的左半部分
                l1 = mid1 + even; // 长度为偶数子区间,因为是mid是靠下取值,所以要加1作为右区间起点
                r2 = mid2;
            }
            else {
                l2 = mid2 + even;
                r1 = mid1;
            }
        }
        cout << "l1: " << l1 << " " << "l2: " << l2 << endl;
        return min(arr1[l1], arr2[l2]);
    }
};