5
bool contains(int bitNo) {6
return arr[bitNo] != NULL;9
void put(int bitNo, Node *newNode) {13
Node *getNext(int bitNo) {17
int getCount(int bitNo) {18
return arr[bitNo]->count;21
void setCount(int bitNo) {28
Node *root = new Node();30
void insert(int num) {33
for (int bit = 15; bit >= 0; bit--) {34
int bitVal = (bool)(num & (1 << bit));36
if (!temp->contains(bitVal)) {37
temp->put(bitVal, new Node());39
temp->setCount(bitVal);40
temp = temp->getNext(bitVal);44
int getPairs(int num, int k) {49
for (int bit = 15; bit >= 0 && temp; bit--) {50
int bit_num = (bool)(num & (1 << bit));51
int bit_k = (bool)(k & (1 << bit));54
if (temp->contains(bit_num)) {55
cntPairs += temp->getCount(bit_num);57
if (temp->contains(1 - bit_num)) {58
temp = temp->getNext(1 - bit_num);61
} else if (temp->contains(bit_num)) {62
temp = temp->getNext(bit_num);70
int countPairs(vector<int> &nums, int low, int high) {73
for (int i = 0; i < n; i++) {74
cnt += getPairs(nums[i], high + 1) - getPairs(nums[i], low);