func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, a[50100];   long long m, ans;   struct node {     int s, cnt[30];     node *ch[2];     node();   } * tp, *nul, *root[50100];   int getint() {     char ch;     while (!isdigit(ch = getchar()))       ;     int x = ch -  0 ;     for (; isdigit(ch = getchar()); x = x * 10 + ch -  0 )       ;     return x;   }   node::node() { ch[0] = tp, tp = this; }   node *newnode(node *x) {     if (!tp) new node[50000];     node *t = tp;     tp = t->ch[0], *t = *x;     return t;   }   void insert(node *&x, node *y, int w) {     node *ret = newnode(y);     ++(x = ret)->s;     for (int i = 29; i >= 0; --i) {       for (int j = 0; j <= i; ++j) x->cnt[j] += (w >> j) & 1;       int t = (w >> i) & 1;       x->ch[t] = newnode(y = y->ch[t]), ++(x = x->ch[t])->s;     }     x = ret;   }   int main() {     scanf( %d%I64d , &n, &m);     nul = new node, tp = 0;     memset(nul, 0, sizeof(node));     root[1] = nul->ch[0] = nul->ch[1] = nul;     for (int i = 1; i <= n; ++i) insert(root[i + 1], root[i], a[i] = getint());     for (int i = 29; i >= 0; --i) {       long long sum = 0;       for (int j = 2; j <= n; ++j) sum += root[j]->ch[1 ^ ((a[j] >> i) & 1)]->s;       if (sum < m) {         m -= sum, ans += (1LL << i) * sum;         for (int j = 2; j <= n; ++j) {           node *x = root[j]->ch[1 ^ ((a[j] >> i) & 1)];           for (int k = 0; k <= i - 1; ++k)             ans +=                 (1LL << k) * (((a[j] >> k) & 1) ? x->s - x->cnt[k] : x->cnt[k]);           root[j] = root[j]->ch[(a[j] >> i) & 1];         }       } else {         ans += (1LL << i) * m;         for (int j = 2; j <= n; ++j) root[j] = root[j]->ch[1 ^ ((a[j] >> i) & 1)];       }     }     printf( %d n , ans % 1000000007);     return 0;   }   