import sys input = sys.stdin.readline def find(x): while Group[x] != x: x=Group[x] return x def Union(x,y): if find(x) != find(y): if Nodes[find(x)] < Nodes[find(y)]: Nodes[find(y)] += Nodes[find(x)] Nodes[find(x)] = 0 Group[find(x)] = find(y) else: Nodes[find(x)] += Nodes[find(y)] Nodes[find(y)] = 0 Group[find(y)] = find(x) T=int(input()) for tests in range(T): N=int(input()) A=list(map(int,input().split())) A.sort() X=[] Y=[] Z=[] for a in A: if a>0: X.append(a) elif a<0: Y.append(a) else: Z.append(a) if X: if len(X)>10: X=X[:2]+X[-2:] if Y: if len(Y)>10: Y=Y[:2]+Y[-2:] if Z: if len(Z)>10: Z=[0] A=X+Y+X n=len(A) ANS=-1<<60 SET=set() for i in range(len(A)): for j in range(i+1,len(A)): X=A[i]*A[j] SET.add(X) SET=sorted(SET) OK=0 NG=len(SET) while NG>OK+1: mid=(OK+NG)//2 X=SET[mid] #print(X) Group = [i for i in range(n)] # グループ分け Nodes = [1]*(n) # 各グループのノードの数 for k in range(len(A)): for l in range(k+1,len(A)): if A[k]*A[l]>=X: Union(k,l) if Nodes[find(0)]==len(A): OK=mid else: NG=mid print(SET[OK])