---
# System prepended metadata

title: 1310. XOR Queries of a Subarray

---

# [1310. XOR Queries of a Subarray](https://leetcode.com/problems/xor-queries-of-a-subarray/description)

# 1. Tóm tắt đề bài

Cho một mảng $arr$ gồm các số nguyên dương. Có $Q$ truy vấn, mỗi truy vấn hỏi $[L, R]$, và bạn phải tính tổng $xor$ của các phần tử từ $L$ đến $R$ trong dãy $arr$.

##### Giới hạn

$1 \le |arr| \le 30000$
$1 \le q \le 30000$
$1 \le arr_i \le 10^9$

# 2. Tóm tắt lời giải

**Độ phức tạp dự tính: $O(n + q)$**

Ta có tính chất sau:

- $a \oplus b = c$
- $b \oplus c = a$
- $c \oplus a = b$

Vì vậy, khi mà ta áp dụng prefix sum trên $arr$ (đặt là $psum$), ta có thể tính được tổng xor trong đoạn từ $L$ đến $R$ trong $O(1)$, bằng công thức $arr_R \oplus arr_{L - 1}$.

# 3. Lời giải chi tiết

Sau khi ra được ý tưởng, lời giải trở nên chỉ còn 2 bước khá đơn giản:

- Tính mảng $psum$.
- Dựa vào công thức tính kết quả cho từng query.

Code mẫu (Golang):

```go=
func xorQueries(arr []int, queries [][]int) []int {
    n := len(arr)
    psum := make([]int, n + 1)
    for i := 0; i < n; i++ {
        psum[i + 1] = psum[i] ^ arr[i]
    }
    res := make([]int, 0)
    for _, c := range queries {
        res = append(res, psum[c[1] + 1] ^ psum[c[0]])
    }
    return res
}
```

### Độ phức tạp thuật toán

Thời gian: $O(n)$

Bộ nhớ mở rộng: $O(n)$
