```go
package main
import (
"io"
"os"
"sort"
"strconv"
)
type FastScanner struct {
data []byte
idx int
n int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data, n: len(data)}
}
func (fs *FastScanner) NextInt() int {
for fs.idx < fs.n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
sign := 1
if fs.idx < fs.n && fs.data[fs.idx] == '-' {
sign = -1
fs.idx++
}
val := 0
for fs.idx < fs.n {
c := fs.data[fs.idx]
if c < '0' || c > '9' {
break
}
val = val*10 + int(c-'0')
fs.idx++
}
return val * sign
}
type Pair struct {
v int
pos int
}
func main() {
fs := NewFastScanner()
t := fs.NextInt()
out := make([]byte, 0, t*32)
for ; t > 0; t-- {
n := fs.NextInt()
values := make([]int, n+1)
for i := 1; i <= n; i++ {
values[i] = fs.NextInt()
}
pairs := make([]Pair, n)
for pos := 1; pos <= n; pos++ {
idx := fs.NextInt()
pairs[pos-1] = Pair{v: values[idx], pos: pos}
}
sort.Slice(pairs, func(i, j int) bool {
return pairs[i].v > pairs[j].v
})
active := make([]bool, n+2)
total, h, small := 0, 0, 0
bestProd := int64(-1)
bestK := 0
for i := 0; i < n; {
val := pairs[i].v
j := i
for j < n && pairs[j].v == val {
pos := pairs[j].pos
active[pos] = true
total++
if pos <= h {
small++
}
for total-small >= h+1 {
h++
if active[h] {
small++
}
}
j++
}
prod := int64(h) * int64(val)
if prod > bestProd || (prod == bestProd && h < bestK) {
bestProd = prod
bestK = h
}
i = j
}
out = strconv.AppendInt(out, bestProd, 10)
out = append(out, ' ')
out = strconv.AppendInt(out, int64(bestK), 10)
out = append(out, '\n')
}
os.Stdout.Write(out)
}
```