using
System;
using
System.Collections.Generic;
class
Program
{
struct
Query
{
public
int
L, R, idx;
}
static
int
CompareQueries(Query a, Query b)
{
if
(a.R != b.R)
return
a.R.CompareTo(b.R);
else
return
a.L.CompareTo(b.L);
}
static
int
GetSum(
int
[] BIT,
int
index)
{
int
xorSum = 0;
index = index + 1;
while
(index > 0)
{
xorSum ^= BIT[index];
index -= index & (-index);
}
return
xorSum;
}
static
void
UpdateBIT(
int
[] BIT,
int
index,
int
val)
{
index = index + 1;
while
(index < BIT.Length)
{
BIT[index] ^= val;
index += index & (-index);
}
}
static
int
[] ConstructBITree(
int
[] arr,
int
N)
{
int
[] BIT =
new
int
[N + 1];
for
(
int
i = 1; i <= N; i++)
BIT[i] = 0;
return
BIT;
}
static
void
AnsweringQueries(
int
[] arr,
int
N, Query[] queries,
int
Q,
int
[] BIT)
{
int
[] prefixXOR =
new
int
[N + 1];
Dictionary<
int
,
int
> mp =
new
Dictionary<
int
,
int
>();
for
(
int
i = 0; i < N; i++)
{
if
(!mp.ContainsKey(arr[i]))
mp[arr[i]] = i;
if
(i == 0)
prefixXOR[i] = arr[i];
else
prefixXOR[i] = prefixXOR[i - 1] ^ arr[i];
}
int
[] lastOcc =
new
int
[1000001];
for
(
int
i = 0; i < lastOcc.Length; i++)
lastOcc[i] = -1;
Array.Sort(queries, CompareQueries);
int
[] res =
new
int
[Q];
int
j = 0;
for
(
int
i = 0; i < Q; i++)
{
while
(j <= queries[i].R)
{
if
(lastOcc[mp[arr[j]]] != -1)
UpdateBIT(BIT, lastOcc[mp[arr[j]]], arr[j]);
UpdateBIT(BIT, j, arr[j]);
lastOcc[mp[arr[j]]] = j;
j++;
}
int
allXOR = prefixXOR[queries[i].R] ^ (queries[i].L > 0 ? prefixXOR[queries[i].L - 1] : 0);
int
distinctXOR = GetSum(BIT, queries[i].R) ^ (queries[i].L > 0 ? GetSum(BIT, queries[i].L - 1) : 0);
res[queries[i].idx] = allXOR ^ distinctXOR;
}
for
(
int
i = 0; i < Q; i++)
Console.WriteLine(res[i]);
}
static
void
Main()
{
int
[] arr = { 1, 2, 1, 3, 3, 2, 3 };
int
N = arr.Length;
int
[] BIT = ConstructBITree(arr, N);
Query[] queries =
new
Query[5];
queries[0] =
new
Query { L = 3, R = 6, idx = 0 };
queries[1] =
new
Query { L = 3, R = 4, idx = 1 };
queries[2] =
new
Query { L = 0, R = 2, idx = 2 };
queries[3] =
new
Query { L = 0, R = 6, idx = 3 };
queries[4] =
new
Query { L = 0, R = 4, idx = 4 };
int
Q = queries.Length;
AnsweringQueries(arr, N, queries, Q, BIT);
}
}