← Home
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int64 {
		for idx < len(data) && data[idx] <= ' ' {
			idx++
		}
		var sign int64 = 1
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		var val int64
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int64(data[idx]-'0')
			idx++
		}
		return val * sign
	}

	n := int(nextInt())
	b := make([]int64, n)
	d := make([]int64, n)

	for i := 0; i < n; i++ {
		b[i] = nextInt()
	}

	var total int64
	for i := 0; i < n; i++ {
		c := nextInt()
		d[i] = b[i] + c
		total += d[i]
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer w.Flush()

	denom := int64(2 * n)
	if total%denom != 0 {
		w.WriteString("-1")
		return
	}

	S := total / denom
	a := make([]int64, n)
	var sumA int64
	nn := int64(n)
	ok := true

	for i := 0; i < n; i++ {
		x := d[i] - S
		if x < 0 || x%nn != 0 {
			ok = false
			break
		}
		a[i] = x / nn
		sumA += a[i]
	}

	if ok && sumA != S {
		ok = false
	}

	const B = 31

	if ok {
		cnt := make([]int64, B)
		for i := 0; i < n; i++ {
			v := a[i]
			for k := 0; k < B; k++ {
				if v&(int64(1)<<k) != 0 {
					cnt[k]++
				}
			}
		}

		contrib := make([]int64, B)
		for k := 0; k < B; k++ {
			contrib[k] = cnt[k] * (int64(1) << k)
		}

		for i := 0; i < n; i++ {
			v := a[i]
			var s int64
			for k := 0; k < B; k++ {
				if v&(int64(1)<<k) != 0 {
					s += contrib[k]
				}
			}
			if s != b[i] {
				ok = false
				break
			}
		}
	}

	if !ok {
		w.WriteString("-1")
		return
	}

	for i := 0; i < n; i++ {
		if i > 0 {
			w.WriteByte(' ')
		}
		w.WriteString(strconv.FormatInt(a[i], 10))
	}
}