← Home
package main

import (
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0

	readInt := func() int {
		for idx < len(data) && (data[idx] == ' ' || data[idx] == '\n' || data[idx] == '\r' || data[idx] == '\t') {
			idx++
		}
		sign := 1
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val * sign
	}

	readString := func() string {
		for idx < len(data) && (data[idx] == ' ' || data[idx] == '\n' || data[idx] == '\r' || data[idx] == '\t') {
			idx++
		}
		start := idx
		for idx < len(data) && data[idx] != ' ' && data[idx] != '\n' && data[idx] != '\r' && data[idx] != '\t' {
			idx++
		}
		return string(data[start:idx])
	}

	t := readInt()
	var out strings.Builder

	for ; t > 0; t-- {
		n := readInt()
		a := make([]int, n+1)
		px := make([]int, n+1)

		for i := 1; i <= n; i++ {
			a[i] = readInt()
			px[i] = px[i-1] ^ a[i]
		}

		s := readString()
		xr0, xr1 := 0, 0
		for i := 1; i <= n; i++ {
			if s[i-1] == '0' {
				xr0 ^= a[i]
			} else {
				xr1 ^= a[i]
			}
		}

		q := readInt()
		for ; q > 0; q-- {
			tp := readInt()
			if tp == 1 {
				l := readInt()
				r := readInt()
				seg := px[r] ^ px[l-1]
				xr0 ^= seg
				xr1 ^= seg
			} else {
				g := readInt()
				if g == 0 {
					out.WriteString(strconv.Itoa(xr0))
				} else {
					out.WriteString(strconv.Itoa(xr1))
				}
				out.WriteByte('\n')
			}
		}
	}

	fmt.Print(out.String())
}