var maxEnvelopes = function(envelopes) {    if (envelopes.length === 0) {        return 0;    }    const n = envelopes.length;    envelopes.sort((e1, e2) => {        if (e1[0] !== e2[0]) {            return e1[0] - e2[0];        } else {            return e2[1] - e1[1];        }    })    const f = new Array(n).fill(1);    let ans = 1;    for (let i = 1; i < n; ++i) {        for (let j = 0; j < i; ++j) {            if (envelopes[j][1] < envelopes[i][1]) {                f[i] = Math.max(f[i], f[j] + 1);            }        }        ans = Math.max(ans, f[i]);    }    return ans;};
var maxEnvelopes = function(envelopes) {
    if (envelopes.length === 0) {
        return 0;
    }
    const n = envelopes.length;
    envelopes.sort((e1, e2) => {
        if (e1[0] - e2[0]) {
            return e1[0] - e2[0];
        } else {
            return e2[1] - e1[1];
        }
    })
    const f = [envelopes[0][1]];
    for (let i = 1; i < n; ++i) {
        const num = envelopes[i][1];
        if (num > f[f.length - 1]) {
            f.push(num);
        } else {
            const index = binarySearch(f, num);
            f[index] = num;
        }
    }
    return f.length;
}
const binarySearch = (f, target) => {
    let low = 0, high = f.length - 1;
    while (low < high) {
        const mid = Math.floor((high - low) / 2) + low;
        if (f[mid] < target) {
            low = mid + 1;
        } else {
            high = mid;
        }
    }
    return low;
};