#include #include using namespace std; typedef long long ll; typedef long double ld; // read template long long readInt(long long l,long long r,char endd){ long long x=0; int cnt=0; int fi=-1; bool is_neg=false; while(true){ char g=getchar(); if(g=='-'){ assert(fi==-1); is_neg=true; continue; } if('0'<=g && g<='9'){ x*=10; x+=g-'0'; if(cnt==0){ fi=g-'0'; } cnt++; assert(fi!=0 || cnt==1); assert(fi!=0 || is_neg==false); assert(!(cnt>19 || ( cnt==19 && fi>1) )); } else if(g==endd){ assert(cnt>0); if(is_neg){ x= -x; } assert(l<=x && x<=r); return x; } else { assert(false); } } } string readString(int l,int r,char endd){ string ret=""; int cnt=0; while(true){ char g=getchar(); assert(g!=-1); if(g==endd){ break; } cnt++; ret+=g; } assert(l<=cnt && cnt<=r); return ret; } long long readIntSp(long long l,long long r){ return readInt(l,r,' '); } long long readIntLn(long long l,long long r){ return readInt(l,r,'\n'); } string readStringLn(int l,int r){ return readString(l,r,'\n'); } string readStringSp(int l,int r){ return readString(l,r,' '); } // end const int M = 1e5 + 239; const int th = 3; int n, k, a[M], sum, bef[th][M]; map kol; void solve() { n = readIntSp(1, (int)(1e5)); k = readIntLn(0, n); for (int i = 0; i < n; i++) { if (i < n - 1) a[i] = readIntSp(1, (int)(1e9)); else a[i] = readIntLn(1, (int)(1e9)); } sum += n; kol.clear(); for (int i = 0; i < n; i++) kol[a[i]]++; k -= kol.size(); if (k <= 0) { cout << "-1\n"; return; } int mx = 0; for (pair t : kol) mx = max(mx, t.second - 1); if (k <= min(mx, 2)) { cout << "-1\n"; return; } vector > now; for (pair t : kol) if (t.second >= 2) now.push_back(make_pair(t.second - 1, t.first)); ll ans = (ll)(1e18) + 239; int kl = 0; for (int x = 0; x < 3; x++) { bef[x][now.size()] = now.size(); for (int i = (int)now.size() - 1; i >= 0; i--) { bef[x][i] = bef[x][i + 1]; if (now[i].first >= x) bef[x][i] = i; } } for (int i = 0; i < (int)now.size(); i++) { kl += now[i].first; if (now[i].second >= 3 && kl >= k) ans = min(ans, (ll)now[i].second * (ll)now[i].second); if (k - kl > 2) continue; if (i + 1 >= now.size()) continue; int it = bef[max(k - kl, 0)][i + 1]; if (it < now.size() && k - kl <= 2) ans = min(ans, (ll)now[i].second * (ll)now[it].second); } cout << ans << "\n"; } int main() { int T = readIntLn(1, 100); sum = 0; while (T--) solve(); assert(getchar() == -1); assert((sum <= (int)(1e5))); return 0; }