← Home
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')
	}
}