//author@nowadays - 2021-06-06  23:18:31
#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> b(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());
    int nb = (int) b.size();
    vector<int> f(nb + 1, 0);
    function<void(int, int)> ft_update = [&](int u, int value) {
        while (u <= nb) {
            f[u] += value;
            u += u & -u;
        }
    };
    function<int(int)> ft_get = [&](int u) {
        int ans = 0;
        while (u > 0) {
            ans += f[u];
            u -= u & -u;
        }
        return ans;
    };
    vector<int> ans(n + n - 1);
    int mi = - 1e9 - 1;
    int ma = + 1e9 + 1;
    int ps = 0;
    int wlef = 0;
    int wrig = 0;
    bool good = true;
    for (int i = 0; i < n; ++i) {
        int idx = (int)(lower_bound(b.begin(), b.end(), a[i]) - b.begin()) + 1;
        int lef = ft_get(idx - 1);
        int mid = ft_get(idx) - lef;
        int rig = ft_get(nb) - (mid + lef);
        int cnt = (i == 0 ? 0 : 1);
        if (mid == 0) {
            ft_update(idx, 1);
            ans[ps++] = a[i];
        } else {
            ++cnt;
        }
        while (cnt > 0) {
            if (lef + wlef > wrig + rig) {
                ++wrig;
                ans[ps++] = ma++;
                --cnt;
                continue;
            }
            if (lef + wlef < wrig + rig) {
                ++wlef;
                ans[ps++] = mi--;
                --cnt;
                continue;
            }
            if (lef + wlef == wrig + rig) {
                if (cnt % 2 != 0) {
                    good = false;
                    break;
                }
                ++wlef;
                ++wrig;
                ans[ps++] = mi--;
                ans[ps++] = ma++;
                --cnt;
                --cnt;
                continue;
            }
        }
        if (!good || (lef + wlef != rig + wrig)) {
            good = false;
            break;
        }
    }
    if (good) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }
    // for (auto i: ans) {
    //     cout << i << " ";
    // }
    // cout << "\n";
}

int main() {
    ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
### Prompt

Your challenge is to write a Cpp solution to the following problem:

Uh oh! Ray lost his array yet again! However, Omkar might be able to help because he thinks he has found the OmkArray of Ray's array. The OmkArray of an array a with elements a_1, a_2, …, a_{2k-1}, is the array b with elements b_1, b_2, …, b_{k} such that b_i is equal to the median of a_1, a_2, …, a_{2i-1} for all i. Omkar has found an array b of size n (1 ≤ n ≤ 2 ⋅ 10^5, -10^9 ≤ b_i ≤ 10^9). Given this array b, Ray wants to test Omkar's claim and see if b actually is an OmkArray of some array a. Can you help Ray?

The median of a set of numbers a_1, a_2, …, a_{2i-1} is the number c_{i} where c_{1}, c_{2}, …, c_{2i-1} represents a_1, a_2, …, a_{2i-1} sorted in nondecreasing order. 

Input

Each test contains multiple test cases. The first line contains a single integer t (1 ≤ t ≤ 10^4) — the number of test cases. Description of the test cases follows.

The first line of each test case contains an integer n (1 ≤ n ≤ 2 ⋅ 10^5) — the length of the array b.

The second line contains n integers b_1, b_2, …, b_n (-10^9 ≤ b_i ≤ 10^9) — the elements of b.

It is guaranteed the sum of n across all test cases does not exceed 2 ⋅ 10^5. 

Output

For each test case, output one line containing YES if there exists an array a such that b_i is the median of a_1, a_2, ..., a_{2i-1} for all i, and NO otherwise. The case of letters in YES and NO do not matter (so yEs and No will also be accepted).

Examples

Input


5
4
6 2 1 3
1
4
5
4 -8 5 6 -7
2
3 3
4
2 1 2 3


Output


NO
YES
NO
YES
YES


Input


5
8
-8 2 -6 -5 -4 3 3 2
7
1 1 3 1 0 -2 -1
7
6 12 8 6 2 6 10
6
5 1 2 3 6 7
5
1 3 4 3 0


Output


NO
YES
NO
NO
NO

Note

In the second case of the first sample, the array [4] will generate an OmkArray of [4], as the median of the first element is 4.

In the fourth case of the first sample, the array [3, 2, 5] will generate an OmkArray of [3, 3], as the median of 3 is 3 and the median of 2, 3, 5 is 3.

In the fifth case of the first sample, the array [2, 1, 0, 3, 4, 4, 3] will generate an OmkArray of [2, 1, 2, 3] as 

  * the median of 2 is 2 
  * the median of 0, 1, 2 is 1 
  * the median of 0, 1, 2, 3, 4 is 2 
  * and the median of 0, 1, 2, 3, 3, 4, 4 is 3. 



In the second case of the second sample, the array [1, 0, 4, 3, 5, -2, -2, -2, -4, -3, -4, -1, 5] will generate an OmkArray of [1, 1, 3, 1, 0, -2, -1], as 

  * the median of 1 is 1 
  * the median of 0, 1, 4 is 1 
  * the median of 0, 1, 3, 4, 5 is 3 
  * the median of -2, -2, 0, 1, 3, 4, 5 is 1 
  * the median of -4, -2, -2, -2, 0, 1, 3, 4, 5 is 0 
  * the median of -4, -4, -3, -2, -2, -2, 0, 1, 3, 4, 5 is -2 
  * and the median of -4, -4, -3, -2, -2, -2, -1, 0, 1, 3, 4, 5, 5 is -1 



For all cases where the answer is NO, it can be proven that it is impossible to find an array a such that b is the OmkArray of a.

### Response

```cpp
//author@nowadays - 2021-06-06  23:18:31
#include <bits/stdc++.h>
using namespace std;

void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> b(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b.begin(), b.end());
    b.erase(unique(b.begin(), b.end()), b.end());
    int nb = (int) b.size();
    vector<int> f(nb + 1, 0);
    function<void(int, int)> ft_update = [&](int u, int value) {
        while (u <= nb) {
            f[u] += value;
            u += u & -u;
        }
    };
    function<int(int)> ft_get = [&](int u) {
        int ans = 0;
        while (u > 0) {
            ans += f[u];
            u -= u & -u;
        }
        return ans;
    };
    vector<int> ans(n + n - 1);
    int mi = - 1e9 - 1;
    int ma = + 1e9 + 1;
    int ps = 0;
    int wlef = 0;
    int wrig = 0;
    bool good = true;
    for (int i = 0; i < n; ++i) {
        int idx = (int)(lower_bound(b.begin(), b.end(), a[i]) - b.begin()) + 1;
        int lef = ft_get(idx - 1);
        int mid = ft_get(idx) - lef;
        int rig = ft_get(nb) - (mid + lef);
        int cnt = (i == 0 ? 0 : 1);
        if (mid == 0) {
            ft_update(idx, 1);
            ans[ps++] = a[i];
        } else {
            ++cnt;
        }
        while (cnt > 0) {
            if (lef + wlef > wrig + rig) {
                ++wrig;
                ans[ps++] = ma++;
                --cnt;
                continue;
            }
            if (lef + wlef < wrig + rig) {
                ++wlef;
                ans[ps++] = mi--;
                --cnt;
                continue;
            }
            if (lef + wlef == wrig + rig) {
                if (cnt % 2 != 0) {
                    good = false;
                    break;
                }
                ++wlef;
                ++wrig;
                ans[ps++] = mi--;
                ans[ps++] = ma++;
                --cnt;
                --cnt;
                continue;
            }
        }
        if (!good || (lef + wlef != rig + wrig)) {
            good = false;
            break;
        }
    }
    if (good) {
        cout << "YES\n";
    } else {
        cout << "NO\n";
    }
    // for (auto i: ans) {
    //     cout << i << " ";
    // }
    // cout << "\n";
}

int main() {
    ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
    int t;
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
```