#include using namespace std; #define rep(i, n) for(int i = 0; i < n; i++) #define rep2(i, x, n) for(int i = x; i <= n; i++) #define rep3(i, x, n) for(int i = x; i >= n; i--) #define elif else if #define sp(x) fixed << setprecision(x) #define pb push_back #define eb emplace_back #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() using ll = long long; using pii = pair; using pil = pair; using pli = pair; using pll = pair; const int MOD = 1000000007; //const int MOD = 998244353; const int inf = (1<<30)-1; const ll INF = (1LL<<60)-1; const double pi = acos(-1.0); const double EPS = 1e-10; template bool chmax(T &x, const T &y) {return (x < y)? (x = y, true) : false;}; template bool chmin(T &x, const T &y) {return (x > y)? (x = y, true) : false;}; template struct Segment_Tree{ vector seg; const Monoid e; const int n; Monoid f(const Monoid &a, const Monoid &b) const{ Monoid ret(18, 0); rep(i, 18) ret[i] = a[i]+b[i]; return ret; } Segment_Tree(int N, const Monoid &e) : e(e), n(1<<(32-__builtin_clz(N-1))){ seg.assign(2*n, e); } void change(int i, const Monoid &x){ seg[i += n] = x; while(i > 0){ i /= 2; seg[i] = f(seg[2*i], seg[2*i+1]); } } Monoid query(int a, int b, int i, int l, int r) const{ if(a >= r || b <= l) return e; if(a <= l && r <= b) return seg[i]; Monoid vl = query(a, b, 2*i, l, (l+r)/2); Monoid vr = query(a, b, 2*i+1, (l+r)/2, r); return f(vl, vr); } Monoid query(int a, int b) {return query(a, b, 1, 0, n);} bool check(const Monoid &a, const Monoid & b) const {return a <= b;} int find_first(int a, int b, const Monoid &x, int i, int l, int r) const{ if(a >= b || a >= r || b <= l || !check(seg[i], x)) return -1; if(r-l == 1) return l; int m = (l+r)/2; if(b <= m) return find_first(a, b, x, 2*i, l, m); if(a >= m) return find_first(a, b, x, 2*i+1, m, r); int tmp = find_first(a, m, x, 2*i, l, m); return (tmp == -1? find_first(m, b, x, 2*i+1, m, r) : tmp); } int find_first(int a, int b, const Monoid &x) const {return find_first(a, b, x, 1, 0, n);} int find_last(int a, int b, const Monoid &x, int i, int l, int r) const{ if(a >= b || a >= r || b <= l || !check(seg[i], x)) return -1; if(r-l == 1) return l; int m = (l+r)/2; if(b <= m) return find_last(a, b, x, 2*i, l, m); if(a >= m) return find_last(a, b, x, 2*i+1, m, r); int tmp = find_last(m, b, x, 2*i+1, m, r); return (tmp == -1? find_last(a, m, x, 2*i, l, m) : tmp); } int find_last(int a, int b, const Monoid &x) const {return find_last(a, b, x, 1, 0, n);} Monoid operator [] (int i) const {return seg[n+i];} void clear(){ fill(all(seg), e); } }; int main(){ int N, X; cin >> N >> X; ll ans = 0; vector a(N); vector cnt(1<<18, 0); rep(i, N){ cin >> a[i]; ans -= a[i], cnt[a[i]]++; } Segment_Tree> seg(N, vector(18, 0)); sort(all(a)); rep(i, N){ vector tmp(18); rep(j, 18) tmp[j] = (a[i]>>j)&1; seg.change(i, tmp); } rep(i, 1<<18){ if(cnt[i] == 0) continue; int y = 0; rep3(j, 17, 0){ if((X>>j)&1){ if((i>>j)&1) y |= 1< tmp = seg.query(l, r); rep(k, 18){ if((i>>k)&1) ans += (1LL<>j)&1) y |= 1<