<p>You are given an array <code>arr</code> of positive integers. You are also given the array <code>queries</code> where <code>queries[i] = [left<sub>i, </sub>right<sub>i</sub>]</code>.</p>

<p>For each query <code>i</code> compute the <strong>XOR</strong> of elements from <code>left<sub>i</sub></code> to <code>right<sub>i</sub></code> (that is, <code>arr[left<sub>i</sub>] XOR arr[left<sub>i</sub> + 1] XOR ... XOR arr[right<sub>i</sub>]</code> ).</p>

<p>Return an array <code>answer</code> where <code>answer[i]</code> is the answer to the <code>i<sup>th</sup></code> query.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]
<strong>Output:</strong> [2,7,14,8] 
<strong>Explanation:</strong> 
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
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> arr = [4,8,2,10], queries = [[2,3],[1,3],[0,0],[0,3]]
<strong>Output:</strong> [8,0,4,4]
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= arr.length, queries.length &lt;= 3 * 10<sup>4</sup></code></li>
	<li><code>1 &lt;= arr[i] &lt;= 10<sup>9</sup></code></li>
	<li><code>queries[i].length == 2</code></li>
	<li><code>0 &lt;= left<sub>i</sub> &lt;= right<sub>i</sub> &lt; arr.length</code></li>
</ul>

class SegmentTree {
public:
    vector<int> seg;
    SegmentTree(int n) {
        seg.resize(4*n);
    }

    int query(int segInd, int l, int r, int queryL, int queryR) {
        if(l>=queryL && r<=queryR) {
            return seg[segInd];
        }
        if(r<queryL || l>queryR) {
            return 0;
        }
        int mid = (l+r)/2;
        int leftXor = query(2*segInd+1, l, mid, queryL, queryR);
        int rightXor = query(2*segInd+2, mid+1, r, queryL, queryR);
        return leftXor ^ rightXor;
    }

    void buildUtil(int l, int r, int segInd, vector<int> &arr) {
        if(l==r) {
            seg[segInd] = arr[l];
            return;
        }
        int mid = (l+r)/2;
        buildUtil(l, mid, 2*segInd+1, arr);
        buildUtil(mid+1, r, 2*segInd+2, arr);
        seg[segInd] = seg[2*segInd+1] ^ seg[2*segInd+2];
    }

    void build(vector<int> &arr) {
        int n = arr.size();
        buildUtil(0, n-1, 0, arr);
    }

};
class Solution {
public:
    vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
        int n = arr.size();
        SegmentTree segmentTree = SegmentTree(n);
        segmentTree.build(arr);
        vector<int> ans;
        for(int i=0;i<queries.size();i++) {
            ans.push_back(segmentTree.query(0, 0, n-1, queries[i][0], queries[i][1]));
        }

        return ans;
    }
};
43100