package main
import (
"bufio"
"io"
"os"
)
type FastScanner struct {
data []byte
pos 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.pos < fs.n {
c := fs.data[fs.pos]
if c == '-' || (c >= '0' && c <= '9') {
break
}
fs.pos++
}
sign := 1
if fs.data[fs.pos] == '-' {
sign = -1
fs.pos++
}
val := 0
for fs.pos < fs.n {
c := fs.data[fs.pos]
if c < '0' || c > '9' {
break
}
val = val*10 + int(c-'0')
fs.pos++
}
return sign * val
}
func writeInt(w *bufio.Writer, x int) {
if x == 0 {
w.WriteByte('0')
return
}
if x < 0 {
w.WriteByte('-')
x = -x
}
var buf [20]byte
i := len(buf)
for x > 0 {
i--
buf[i] = byte('0' + x%10)
x /= 10
}
w.Write(buf[i:])
}
func main() {
fs := NewFastScanner()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
t := fs.NextInt()
for ; t > 0; t-- {
n := fs.NextInt()
d := make([]int, n+1)
for i := 1; i <= n; i++ {
d[i] = fs.NextInt()
}
L := make([]int, n+1)
R := make([]int, n+1)
L[0], R[0] = 0, 0
ok := true
for i := 1; i <= n; i++ {
l := fs.NextInt()
r := fs.NextInt()
if !ok {
continue
}
low, high := 0, 0
if d[i] == 0 {
low = L[i-1]
high = R[i-1]
} else if d[i] == 1 {
low = L[i-1] + 1
high = R[i-1] + 1
} else {
low = L[i-1]
high = R[i-1] + 1
}
if low < l {
low = l
}
if high > r {
high = r
}
if low > high {
ok = false
} else {
L[i] = low
R[i] = high
}
}
if !ok {
writeInt(out, -1)
out.WriteByte('\n')
continue
}
h := make([]int, n+1)
h[n] = L[n]
for i := n; i >= 1; i-- {
if d[i] == 0 {
h[i-1] = h[i]
} else if d[i] == 1 {
h[i-1] = h[i] - 1
} else {
if L[i-1] <= h[i] && h[i] <= R[i-1] {
d[i] = 0
h[i-1] = h[i]
} else {
d[i] = 1
h[i-1] = h[i] - 1
}
}
}
for i := 1; i <= n; i++ {
if i > 1 {
out.WriteByte(' ')
}
writeInt(out, d[i])
}
out.WriteByte('\n')
}
}