#include <bits/stdc++.h>
#define int long long
#define BIG 10000000000
#define SMALL -10000000000
using namespace std;

struct Tree{
    int n,N=1,k=0;
    vector<int> tree;
    Tree(int i, int _n){
        n = _n+2;
        while(N < n){
            N <<= 1; k ++;
        }
        tree.resize(2*N); tree[N] = tree[N+i] = tree[2*N-1] = 1;
        for(int i = N-1; i > 0; i --) tree[i] = tree[2*i] + tree[2*i+1];
    }
    void update(int i){
        i += N; tree[i] = 1; i /= 2;
        while(i){
            tree[i] = 1; i /= 2;
        }
    }
    int sum(int l, int r){
        l += N; r += N;
        int s = 0;
        while(l < r){
            if(l % 2){
                s += tree[l]; l ++;
            }
            if(r % 2){
                r --; s += tree[r];
            }
            l /= 2; r /= 2;
        }
        return s;
    }
    int findl(int i){
        /*i --;
        while(tree[i+N] == 0) i --;
        return i;*/
        int l = 0, r = i;
        while(l+1 < r){
            int m = (l+r)/2;
            (sum(m,i) == 0 ? r : l) = m;
        }
        return l;
    }
    int findr(int i){
        /*i ++;
        while(tree[i+N] == 0) i ++;
        return i;*/
        int l = i+1, r = N;
        while(l+1 < r){
            int m = (l+r)/2;
            (sum(i+1,m) == 0 ? l : r) = m;
        }
        return l;
    }
};

signed main(){
    int t; cin >> t;
    while(t--){
        int n; cin >> n;
        vector<int> b(n); for(auto &v : b) cin >> v;
        //coord compress
        vector<int> c = b;
        sort(c.begin(), c.end());
        map<int,int> a;
        for(int i = 0; i < n; i ++) a[c[i]] = i;
        for(auto &v : b) v = a[v]+1;
        //
        bool okay = true;
        int p = b[0];
        Tree tree(b[0],n);
        for(int i : b){
            if(p == i) continue;
            else if(i < p){
                int l = tree.findl(p);
                if(i < l){
                    okay = false; break;
                }
                p = i; tree.update(i);
            }else{
                int r = tree.findr(p);
                if(i > r){
                    okay = false; break;
                }
                p = i; tree.update(i);
            }
        }
        cout << (okay ? "YES\n" : "NO\n");
    }
}
### Prompt

Generate 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
#include <bits/stdc++.h>
#define int long long
#define BIG 10000000000
#define SMALL -10000000000
using namespace std;

struct Tree{
    int n,N=1,k=0;
    vector<int> tree;
    Tree(int i, int _n){
        n = _n+2;
        while(N < n){
            N <<= 1; k ++;
        }
        tree.resize(2*N); tree[N] = tree[N+i] = tree[2*N-1] = 1;
        for(int i = N-1; i > 0; i --) tree[i] = tree[2*i] + tree[2*i+1];
    }
    void update(int i){
        i += N; tree[i] = 1; i /= 2;
        while(i){
            tree[i] = 1; i /= 2;
        }
    }
    int sum(int l, int r){
        l += N; r += N;
        int s = 0;
        while(l < r){
            if(l % 2){
                s += tree[l]; l ++;
            }
            if(r % 2){
                r --; s += tree[r];
            }
            l /= 2; r /= 2;
        }
        return s;
    }
    int findl(int i){
        /*i --;
        while(tree[i+N] == 0) i --;
        return i;*/
        int l = 0, r = i;
        while(l+1 < r){
            int m = (l+r)/2;
            (sum(m,i) == 0 ? r : l) = m;
        }
        return l;
    }
    int findr(int i){
        /*i ++;
        while(tree[i+N] == 0) i ++;
        return i;*/
        int l = i+1, r = N;
        while(l+1 < r){
            int m = (l+r)/2;
            (sum(i+1,m) == 0 ? l : r) = m;
        }
        return l;
    }
};

signed main(){
    int t; cin >> t;
    while(t--){
        int n; cin >> n;
        vector<int> b(n); for(auto &v : b) cin >> v;
        //coord compress
        vector<int> c = b;
        sort(c.begin(), c.end());
        map<int,int> a;
        for(int i = 0; i < n; i ++) a[c[i]] = i;
        for(auto &v : b) v = a[v]+1;
        //
        bool okay = true;
        int p = b[0];
        Tree tree(b[0],n);
        for(int i : b){
            if(p == i) continue;
            else if(i < p){
                int l = tree.findl(p);
                if(i < l){
                    okay = false; break;
                }
                p = i; tree.update(i);
            }else{
                int r = tree.findr(p);
                if(i > r){
                    okay = false; break;
                }
                p = i; tree.update(i);
            }
        }
        cout << (okay ? "YES\n" : "NO\n");
    }
}
```