import math
def trig_area(a, c):
s = float((a + a + c) / 2)
return math.sqrt(s * (s - a) * (s - a) * (s - c))
T = int(input())
for t in range(T):
n = int(input())
rec = {}
flag = 0
for i in range(n):
l_i, a_i = list(map(int, input().split()))
if l_i not in rec:
rec[l_i] = a_i
else:
rec[l_i] += a_i
data = list(rec.keys())
data.sort(reverse=True)
# print(data)
n = len(data)
area = 0
for i in range(n):
l_i, a_i = data[i], rec[data[i]]
if a_i>=2:
for j in range(i):
if l_i *2 > data[j]:
tmp = trig_area(l_i, data[j])
if area < tmp:
area = tmp
if a_i>=3:
tmp = trig_area(l_i, l_i)
if area < tmp:
area = tmp
for j in range(i+1, n): # 需要检查底边小于腰的情况,因为底边很大时,面积也会很小
tmp = trig_area(l_i, data[j])
if area < tmp:
area = tmp
if area != 0:#只要找到了最大腰情况,且检查了底边小于腰的情形,可以证明只要腰小于当前腰,面积都会变小
flag = 1
break
if flag==0:
print(-1)
else:
print(round(area,10))