```go
package main
import (
"bufio"
"os"
)
var in = bufio.NewReader(os.Stdin)
var out = bufio.NewWriter(os.Stdout)
func nextInt() int {
res := 0
sign := 1
b, err := in.ReadByte()
for err == nil && (b < '0' || b > '9') && b != '-' {
b, err = in.ReadByte()
}
if err != nil {
return 0
}
if b == '-' {
sign = -1
b, err = in.ReadByte()
}
for err == nil && b >= '0' && b <= '9' {
res = res*10 + int(b-'0')
b, err = in.ReadByte()
}
return res * sign
}
func main() {
defer out.Flush()
t := nextInt()
levels := make([][]int, 30)
for tc := 0; tc < t; tc++ {
n := nextInt()
for i := 0; i < 30; i++ {
levels[i] = levels[i][:0]
}
maxLevel := 0
pos := -1
for i := 1; i <= n; i++ {
val := nextInt()
if val == -1 {
pos = i
} else {
levels[val] = append(levels[val], i)
if val > maxLevel {
maxLevel = val
}
}
}
p := make([]int, n+1)
low := 1
high := n
for k := 1; k <= maxLevel; k++ {
if len(levels[k]) == 0 {
continue
}
if k%2 == 1 {
for _, idx := range levels[k] {
if idx < pos {
p[idx] = high
high--
}
}
for i := len(levels[k]) - 1; i >= 0; i-- {
idx := levels[k][i]
if idx > pos {
p[idx] = high
high--
}
}
} else {
for _, idx := range levels[k] {
if idx < pos {
p[idx] = low
low++
}
}
for i := len(levels[k]) - 1; i >= 0; i-- {
idx := levels[k][i]
if idx > pos {
p[idx] = low
low++
}
}
}
}
p[pos] = low
for i := 1; i <= n; i++ {
val := p[i]
var buf [12]byte
idxBuf := 12
for val > 0 {
idxBuf--
buf[idxBuf] = byte('0' + val%10)
val /= 10
}
out.Write(buf[idxBuf:])
if i < n {
out.WriteByte(' ')
} else {
out.WriteByte('\n')
}
}
}
}
```