using
System;
class
TrieNode {
public
TrieNode[] children;
public
int
sum_of_indexes;
public
int
number_of_indexes;
public
TrieNode()
{
children =
new
TrieNode[2];
this
.children[0] =
null
;
this
.children[1] =
null
;
this
.sum_of_indexes = 0;
this
.number_of_indexes = 0;
}
}
public
class
GFG {
static
int
lg = 31;
static
void
insert(TrieNode node,
int
num,
int
index)
{
for
(
int
bits = lg; bits >= 0; bits--) {
int
curr_bit = (num >> bits) & 1;
if
(node.children[curr_bit] ==
null
) {
node.children[curr_bit] =
new
TrieNode();
}
node = node.children[curr_bit];
}
node.sum_of_indexes += index;
node.number_of_indexes++;
}
static
int
query(TrieNode node,
int
num,
int
index)
{
for
(
int
bits = lg; bits >= 0; bits--) {
int
curr_bit = (num >> bits) & 1;
if
(node.children[curr_bit] ==
null
) {
return
0;
}
node = node.children[curr_bit];
}
int
sz = node.number_of_indexes;
int
sum = node.sum_of_indexes;
int
ans = (sz * index) - (sum);
return
ans;
}
static
int
no_of_triplets(
int
[] arr,
int
n)
{
int
curr_xor = 0;
int
number_of_triplets = 0;
TrieNode root =
new
TrieNode();
for
(
int
i = 0; i < n; i++) {
int
x = arr[i];
insert(root, curr_xor, i);
curr_xor ^= x;
number_of_triplets += query(root, curr_xor, i);
}
return
number_of_triplets;
}
static
public
void
Main()
{
int
[] arr = { 5, 2, 7 };
int
n = arr.Length;
Console.WriteLine(no_of_triplets(arr, n));
}
}