#include<bits/stdc++.h>
#ifdef xay5421
#define D(...) fprintf(stderr,__VA_ARGS__)
#else
#define D(...) ((void)0)
#endif
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define each(x,v) for(auto&x:v)
#define SZ(x) ((int)(x).size())
#define pb push_back
#define eb emplace_back
using namespace std;
template<class T>void rd(T&x){
	int f=0,c;
	while(c=getchar(),!isdigit(c))f^=!(c^45);
	x=c&15;
	while(c=getchar(),isdigit(c))x=x*10+(c&15);
	if(f)x=-x;
}
const int N=200005,B=350;
int T,n,m,a[N],b[N],sum[N],tot[N],bel[N];
vector<int>vec[N];
struct DS{
	int mx;
	vector<int>v;
	bool vis[N];
	void clear(){
		mx=0;
		each(x,v)vis[x]=0;
		v.clear();
	}
	void ps(int x,int y){ // x 出现了 y 次
		if(y>mx){
			clear();
			mx=y;
		}
		if(y==mx){
			if(!vis[x]){
				vis[x]=1;
				v.pb(x);
			}
		}
	}
}ds;
struct segtree{
	int mn[N*4],mx[N*4],tg[N*4];
	void clear(){
		fill(mn+1,mn+n*4+1,0);
		fill(mx+1,mx+n*4+1,0);
		fill(tg+1,tg+n*4+1,0);
	}
	void upd(int k1){
		mn[k1]=max(mn[k1*2],mn[k1*2+1]);
		mx[k1]=max(mx[k1*2],mx[k1*2+1]);
	}
	void pst(int k1,int k2){
		tg[k1]+=k2,mn[k1]+=k2,mx[k1]+=k2;
	}
	void psd(int k1){
		if(tg[k1]){
			pst(k1*2,tg[k1]);
			pst(k1*2+1,tg[k1]);
			tg[k1]=0;
		}
	}
	void add(int k1,int k2,int k3,int k4,int k5,int k6){
		if(k2>k5||k3<k4)return;
		if(k4<=k2&&k3<=k5){
			pst(k1,k6);
			return;
		}
		psd(k1);
		int mid=(k2+k3)>>1;
		add(k1*2,k2,mid,k4,k5,k6),add(k1*2+1,mid+1,k3,k4,k5,k6);
		upd(k1);
	}
	int qmax(int k1,int k2,int k3,int k4,int k5){
		if(k2==k4&&k3==k5)return mx[k1];
		psd(k1);
		int mid=(k2+k3)>>1;
		if(k5<=mid)return qmax(k1*2,k2,mid,k4,k5);else
		if(mid<k4)return qmax(k1*2+1,mid+1,k3,k4,k5);else
			return max(qmax(k1*2,k2,mid,k4,mid),qmax(k1*2+1,mid+1,k3,mid+1,k5));
	}
	int qmin(int k1,int k2,int k3,int k4,int k5){
		if(k2==k4&&k3==k5)return mn[k1];
		psd(k1);
		int mid=(k2+k3)>>1;
		if(k5<=mid)return qmin(k1*2,k2,mid,k4,k5);else
		if(mid<k4)return qmin(k1*2+1,mid+1,k3,k4,k5);else
			return min(qmin(k1*2,k2,mid,k4,mid),qmin(k1*2+1,mid+1,k3,mid+1,k5));
	}
}tr;
int pre[N],suf[N];
void init(int x){
	each(i,vec[x]){
		tr.add(1,1,n,1,i,-1);
	}
	rep(i,1,n){
		pre[i]=a[i]==x?i:pre[i-1];
	}
	per(i,n,1){
		suf[i]=suf[i+1]+(a[i]==x);
	}
}
void undo(int x){
	each(i,vec[x]){
		tr.add(1,1,n,1,i,1);
	}
}
void sol(int x,int y){
	each(i,vec[y]){
		tr.add(1,1,n,1,i,1);
		ds.ps(x,tr.qmax(1,1,n,1,i)-suf[i+1]+tot[x]);
		if(pre[i]){
			ds.ps(y,-tr.qmin(1,1,n,1,pre[i])-suf[pre[i]+1]+tot[y]); //
		}
	}
	ds.ps(y,-tr.qmin(1,1,n,1,n)-suf[n+1]+tot[y]); //
	each(i,vec[y]){
		tr.add(1,1,n,1,i,-1);
	}
}
int bin[N],cnt[N],key;
void ps(int x){
	if(key==cnt[x])++key;
	--bin[cnt[x]];
	++cnt[x];
	++bin[cnt[x]];
}
void pop(int x){
	if(key==cnt[x]&&bin[key]==1)--key;
	--bin[cnt[x]];
	--cnt[x];
	++bin[cnt[x]];
}
int main(){
	freopen("mode.in","r",stdin);
	freopen("mode.out","w",stdout);
	rep(i,1,N-1)bel[i]=(i-1)/B+1;
	rd(T);
	rep(tc,1,T){
		D("tc=%d\n",tc);
		ds.clear();
		rd(n);
		rep(i,1,n)rd(a[i]),b[i]=a[i];
		sort(b+1,b+n+1);
		int m=unique(b+1,b+n+1)-b-1;
		rep(i,1,n)a[i]=lower_bound(b+1,b+m+1,a[i])-b;
		fill(tot+1,tot+m+1,0);
		rep(i,1,n){
			++tot[a[i]];
			vec[a[i]].pb(i);
		}
		rep(i,1,m)if(tot[i]>B){
			D("i=%d tot=%d\n",i,tot[i]);
			init(i);
			rep(j,1,m)if(tot[i]<=B||i<j){
				sol(i,j);
			}
			undo(i);
		}
		vector<tuple<int,int,int,int> >qs;
		rep(u,1,m)if(tot[u]<=B){
			D("! %d\n",SZ(vec[u]));
			rep(i,-1,SZ(vec[u])-1)rep(j,i+1,SZ(vec[u])){
				int l=i==-1?1:vec[u][i]+1;
				int r=j==SZ(vec[u])?n:vec[u][j]-1;
				if(l<=r){
					qs.eb(l,r,u,tot[u]-(j-i-1));
				}
			}
		}
		D("! %d\n",SZ(qs));
		sort(qs.begin(),qs.end(),[&](const tuple<int,int,int,int>&lhs,const tuple<int,int,int,int>&rhs){
			if(bel[get<0>(lhs)]!=bel[get<0>(rhs)]){
				return get<0>(lhs)<get<0>(rhs);
			}else{
				return bel[get<0>(lhs)]&1?get<1>(lhs)<get<1>(rhs):get<1>(lhs)>get<1>(rhs);
			}
		});
		int ql=1,qr=0;
		key=0;
		fill(cnt+1,cnt+n+1,0);
		fill(bin+1,bin+n+1,0);
		bin[0]=m;
		each(u,qs){
			while(ql>get<0>(u)){
				ps(a[--ql]);
			}
			while(qr<get<1>(u)){
				ps(a[++qr]);
			}
			while(ql<get<0>(u)){
				pop(a[ql++]);
			}
			while(qr>get<1>(u)){
				pop(a[qr--]);
			}
			D("key=%d\n",key);
			ds.ps(get<2>(u),get<3>(u)+key);
		}
		printf("%d\n",ds.mx);
		sort(ds.v.begin(),ds.v.end());
		each(x,ds.v)printf("%d\n",b[x]);
		rep(i,1,m)vec[i].clear(),vec[i].shrink_to_fit();
#ifdef xay5421
		break;
#endif
	}
	return 0;
}
