#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
#define pb push_back
#define lson p << 1
#define rson p << 1 | 1
#define fi first
#define se second
const int maxn = 1e6 + 5, maxm = 5e3 + 5;
int a[maxn], b[maxn];
int n, m;
string s;
bool vis[maxn];
int l[maxn], r[maxn], cnt[maxn];
void solve()
{
int k;
cin >> n;
for(int i = 1; i <= n; i++){
vis[i] = 0;
r[i] = 0;
cnt[i] = 0;
}
int res = 0;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
m = 0;
for(int i = 1; i <= n; ){
int j = i;
b[++m] = a[i];//把一段连续相同的数压成一个数,存在b数组
while(j <= n && a[j] == b[m]){
j++;
}
i = j;
}
int N = n;
n = m;
for(int i = 1; i <= n; i++){
a[i] = b[i];
cnt[a[i]]++;//出现次数
r[a[i]] = i;//r[i]是i这个数出现的最右位置
}
int maxr = 0;
for(int i = 1; i <= N; i++){//n的值被改了,不是值域了,用N存原先的n值
if(cnt[i] >= 2){//如果一个数出现两次以上,那么从1到这个数出现的最右位置都应该是0
maxr = max(maxr, r[i]);
}
}
for(int i = maxr; i >= 1; i--){
if(!vis[a[i]]){
vis[a[i]] = 1;//对这个数进行操作
res++;
}
}
if(maxr >= n - 1){
cout << res << '\n';
return;
}
int now = a[n];//当前后缀最小值
for(int i = n - 1; i >= maxr + 1; i--){
if(a[i] > now){
a[i] = 0;
res++;
now = 0;
}
else{
now = a[i];
}
}
cout << res << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
cin >> T;
// for(int i = 1; i <= T; i++){
// num = i;
// solve();
// }
while (T--)
{
solve();
}
}