7
TrieNode() : numOfIndex(0), sumOfIndex(0) {14
void addNumber(TrieNode *root, int num, int idx) {15
for (int i = 31; i >= 0; i--) {16
int bit = 1 & (num >> i);18
if (root->child[bit] == NULL) {19
root->child[bit] = new TrieNode();21
root = root->child[bit];23
root->sumOfIndex += idx;26
int calculateIndexPair(TrieNode *root, int num, int idx) {27
for (int i = 31; i >= 0; i--) {28
int bit = 1 & (num >> i);30
if (root->child[bit] == NULL) {33
root = root->child[bit];35
return (((root->numOfIndex) * idx) - (root->sumOfIndex));37
int countTriplets(vector<int> &arr) {40
TrieNode *root = new TrieNode();42
for (int i = 0; i < arr.size(); i++) {43
addNumber(root, XOR, i);45
ans = (ans + calculateIndexPair(root, XOR, i)) % 1000000007;