#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
int a[200005], b[200005], cnt[65536];
char BB[1 << 20], *S = BB, *T = BB;
inline long long num(int x) { return (long long)x * (x - 1) >> 1; }
inline int read() {
  int x = 0;
  char ch =
      (S == T && (T = (S = BB) + fread(BB, 1, 1 << 20, stdin), S == T) ? EOF
                                                                       : *S++);
  while (ch < 48)
    ch = (S == T && (T = (S = BB) + fread(BB, 1, 1 << 20, stdin), S == T)
              ? EOF
              : *S++);
  while (ch > 47)
    x = x * 10 + (ch ^ 48),
    ch = (S == T && (T = (S = BB) + fread(BB, 1, 1 << 20, stdin), S == T)
              ? EOF
              : *S++);
  return x;
}
int main() {
  long long ans = 0;
  int n = read(), k = read(), m = (1 << k) - 1;
  int s = 1;
  a[0] = read();
  for (int i = 1; i < n; ++i) a[i] = read() ^ a[i - 1];
  for (int i = 0; i < n; ++i)
    if (a[i] >> k - 1 & 1) a[i] ^= m;
  memset(cnt, 0, sizeof cnt), a[n] = 0;
  for (int i = 0; i <= n; ++i) ++cnt[a[i] & 65535];
  for (int i = 1; i < 65536; ++i) cnt[i] += cnt[i - 1];
  for (int i = n; ~i; --i) b[--cnt[a[i] & 65535]] = a[i];
  std::swap(a, b);
  memset(cnt, 0, sizeof cnt);
  for (int i = 0; i <= n; ++i) ++cnt[a[i] >> 16 & 65535];
  for (int i = 1; i < 65536; ++i) cnt[i] += cnt[i - 1];
  for (int i = n; ~i; --i) b[--cnt[a[i] >> 16 & 65535]] = a[i];
  std::swap(a, b);
  for (int i = 1; i <= n; ++i)
    if (a[i] == a[i - 1])
      ++s;
    else
      ans += num(s >> 1) + num(s - (s >> 1)), s = 1;
  printf("%lld", num(n + 1) - ans - num(s >> 1) - num(s - (s >> 1)));
  return 0;
}
