XOR Queries of a Subarray

medium prefix xor bit manipulation

Problem

Given an array arr and a list of queries, where each query is [l, r], return for each query the XOR of arr[l], arr[l+1], …, arr[r].

Inputarr = [1, 3, 4, 8], queries = [[0,1],[1,2],[0,3],[3,3]]
Output[2, 7, 14, 8]
P = [0, 1, 2, 6, 14]. Q[0,1] = P[2]^P[0] = 2^0 = 2.

def xor_queries(arr, queries):
    P = [0] * (len(arr) + 1)
    for i, x in enumerate(arr):
        P[i + 1] = P[i] ^ x
    return [P[r + 1] ^ P[l] for l, r in queries]
function xorQueries(arr, queries) {
  const P = new Array(arr.length + 1).fill(0);
  for (let i = 0; i < arr.length; i++) P[i + 1] = P[i] ^ arr[i];
  return queries.map(([l, r]) => P[r + 1] ^ P[l]);
}
class Solution {
    public int[] xorQueries(int[] arr, int[][] queries) {
        int n = arr.length;
        int[] P = new int[n + 1];
        for (int i = 0; i < n; i++) P[i + 1] = P[i] ^ arr[i];
        int[] out = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            out[i] = P[queries[i][1] + 1] ^ P[queries[i][0]];
        }
        return out;
    }
}
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
    int n = arr.size();
    vector<int> P(n + 1, 0);
    for (int i = 0; i < n; i++) P[i + 1] = P[i] ^ arr[i];
    vector<int> out;
    for (auto& q : queries) out.push_back(P[q[1] + 1] ^ P[q[0]]);
    return out;
}
Time: O(n + q) Space: O(n)