← Home
Looking at this problem, I need to find the XOR of all elements that appear an even number of times in a subarray [l, r].

Key insight: If I XOR all elements in [l,r], I get the XOR of elements appearing an odd number of times. If I XOR all *distinct* elements in [l,r], I get the XOR of all unique values. 

The XOR of elements appearing even times = (XOR of all elements) XOR (XOR of elements appearing odd times) ... wait, let me think again.

Actually: XOR of all elements in [l,r] = XOR of (elements appearing odd times). Because elements appearing even times cancel out in XOR.

XOR of distinct elements in [l,r] = XOR of each unique value once.

XOR of even-count elements = (XOR of all elements) XOR (XOR of distinct elements). Because:
- XOR_all = XOR of odd-count elements
- XOR_distinct = XOR of odd-count elements XOR XOR of even-count elements
- So XOR_distinct XOR XOR_all = XOR of even-count elements

So I need: prefix XOR for total XOR of a range, plus XOR of distinct elements in a range.

XOR of distinct elements in [l,r] can be computed offline using a sweep approach (similar to "number of distinct elements" but with XOR).

Sort queries by r. For each element, track the last occurrence of each value. When processing position r, if value a[r] was last seen at position p, XOR a[r] at position p in a BIT (to remove it) and XOR a[r] at position r. Then for a query [l,r], the XOR of distinct elements is the prefix XOR query from the BIT over [l,r].

```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

var bit []int

func update(i, val, n int) {
	for ; i <= n; i += i & (-i) {
		bit[i] ^= val
	}
}

func query(i int) int {
	res := 0
	for ; i > 0; i -= i & (-i) {
		res ^= bit[i]
	}
	return res
}

func queryRange(l, r int) int {
	return query(r) ^ query(l-1)
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n int
	fmt.Fscan(reader, &n)
	a := make([]int, n+1)
	prefixXor := make([]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &a[i])
		prefixXor[i] = prefixXor[i-1] ^ a[i]
	}

	var m int
	fmt.Fscan(reader, &m)

	type Query struct {
		l, r, idx int
	}
	queries := make([]Query, m)
	for i := 0; i < m; i++ {
		fmt.Fscan(reader, &queries[i].l, &queries[i].r)
		queries[i].idx = i
	}

	sort.Slice(queries, func(i, j int) bool {
		return queries[i].r < queries[j].r
	})

	bit = make([]int, n+1)
	lastOccurrence := make(map[int]int)
	answers := make([]int, m)

	cur := 1
	for qi := 0; qi < m; qi++ {
		q := queries[qi]
		for cur <= q.r {
			val := a[cur]
			if prev, ok := lastOccurrence[val]; ok {
				update(prev, val, n)
			}
			update(cur, val, n)
			lastOccurrence[val] = cur
			cur++
		}
		distinctXor := queryRange(q.l, q.r)
		totalXor := prefixXor[q.r] ^ prefixXor[q.l-1]
		answers[q.idx] = distinctXor ^ totalXor
	}

	for i := 0; i < m; i++ {
		if i > 0 {
			fmt.Fprint(writer, "\n")
		}
		fmt.Fprint(writer, answers[i])
	}
	fmt.Fprintln(writer)
}
```