Post

1435 Xor Queries Of A Subarray

1435 Xor Queries Of A Subarray

XOR Queries of a Subarray image

You are given an array arr of positive integers. You are also given the array queries where queries[i] = [lefti, righti].

For each query i compute the XOR of elements from lefti to righti (that is, arr[lefti] XOR arr[lefti + 1] XOR … XOR arr[righti] ).

Return an array answer where answer[i] is the answer to the ith query.

 

Example 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
**Input:** arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]
**Output:** [2,7,14,8] 
**Explanation:** 
The binary representation of the elements in the array are:
1 = 0001 
3 = 0011 
4 = 0100 
8 = 1000 
The XOR values for queries are:
[0,1] = 1 xor 3 = 2 
[1,2] = 3 xor 4 = 7 
[0,3] = 1 xor 3 xor 4 xor 8 = 14 
[3,3] = 8

Example 2:

1
2
3
4
**Input:** arr = [4,8,2,10], queries = [[2,3],[1,3],[0,0],[0,3]]
**Output:** [8,0,4,4]

 

Constraints:

1
2
3
4
1 <= arr.length, queries.length <= 3 * 104
1 <= arr[i] <= 109
queries[i].length == 2
0 <= lefti <= righti < arr.length
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* xorQueries(int* arr, int arrSize, int** queries, int queriesSize, int* queriesColSize, int* returnSize) {
    
    int *result = malloc(sizeof(int)*queriesSize);
    *returnSize = queriesSize;
    for (int i = 0 ; i < queriesSize; i ++) {
        int a  = queries[i][0];
        int b = queries[i][1];
        int res = arr[a];
        a += 1;
        while(a <= b) {
            res = res ^ arr[a];
            a ++ ;
        }
        result[i] = res;
    }
    return result;
}



This post is licensed under CC BY 4.0 by the author.