#include <bits/stdc++.h>
using namespace std;
inline int read() {
  char c = getchar();
  int p = 1, ret = 0;
  while ((c < '0') || (c > '9')) {
    if (c == '-') p = -1;
    c = getchar();
  }
  while ((c >= '0') && (c <= '9'))
    ret = (ret << 1) + (ret << 3) + c - '0', c = getchar();
  return ret * p;
}
int n, m;
long long ans;
struct tree {
  int v[2][2], num[2][2];
  long long sum[2][2];
  void add(int x, int y, int p) { v[x][y] += p; }
} t[1600005];
struct ele {
  int l, r;
} e[200005];
int head[200005], Head[200005], nex[200005], Nex[200005];
int sum[200005];
inline bool cmp(ele k1, ele k2) { return k1.l < k2.l; }
inline bool Cmp(ele k1, ele k2) { return k1.r < k2.r; }
void pushup(int index, int i, int j) {
  t[index].num[i][j] = t[index].sum[i][j] = 0;
  if (t[index << 1].v[i][j] == 0) {
    t[index].num[i][j] += t[index << 1].num[i][j];
    t[index].sum[i][j] += t[index << 1].sum[i][j];
  }
  if (t[index << 1 | 1].v[i][j] == 0) {
    t[index].num[i][j] += t[index << 1 | 1].num[i][j];
    t[index].sum[i][j] += t[index << 1 | 1].sum[i][j];
  }
}
void build(int l, int r, int index) {
  if (l == r) {
    t[index].num[0][r & 1] = 1;
    t[index].sum[0][r & 1] = r;
    t[index].num[1][r & 1] = 1;
    t[index].sum[1][r & 1] = r;
    return;
  }
  build(l, ((l + r) >> 1), index << 1);
  build(((l + r) >> 1) + 1, r, index << 1 | 1);
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < 2; j++) pushup(index, i, j);
}
void add(int l, int r, int L, int R, int x, int y, int v, int index) {
  if ((L <= l) && (R >= r)) {
    t[index].add(x, y, v);
    return;
  }
  if (L <= ((l + r) >> 1)) add(l, ((l + r) >> 1), L, R, x, y, v, index << 1);
  if (R > ((l + r) >> 1))
    add(((l + r) >> 1) + 1, r, L, R, x, y, v, index << 1 | 1);
  pushup(index, x, y);
}
void workl(int l, int r) {
  add(1, n, l, r, 0, l & 1 ^ 1, -1, 1);
  add(1, n, l, r, 1, l & 1 ^ 1, -1, 1);
  if (((r - l) & 1) && (r < n)) {
    for (int j = 0; j < 2; j++)
      for (int k = 0; k < 2; k++) add(1, n, r + 1, n, j, k, -1, 1);
  }
  for (int i = 0; i < 2; i++) {
    add(1, n, l, r, i, i ^ 1, 1, 1);
    if (r < n) add(1, n, r + 1, n, r & 1 ^ 1, i, 1, 1);
  }
}
void workr(int l, int r) {
  for (int i = 0; i < 2; i++) {
    add(1, n, l, r, i, i ^ 1, -1, 1);
    if (r < n) add(1, n, r + 1, n, r & 1 ^ 1, i, -1, 1);
  }
}
int x[2][2];
void query(int l, int r, int k, int index) {
  if (l >= k) {
    for (int i = 0; i < 2; i++)
      if (x[k & 1][i] + t[index].v[k & 1][i] == 0)
        ans += t[index].sum[k & 1][i] - 1LL * t[index].num[k & 1][i] * (k - 1);
    return;
  }
  for (int i = 0; i < 2; i++) x[k & 1][i] += t[index].v[k & 1][i];
  if (k <= ((l + r) >> 1)) query(l, ((l + r) >> 1), k, index << 1);
  query(((l + r) >> 1) + 1, r, k, index << 1 | 1);
  for (int i = 0; i < 2; i++) x[k & 1][i] -= t[index].v[k & 1][i];
}
int main() {
  m = read();
  n = read();
  build(1, n, 1);
  for (int i = 1; i <= m; i++) {
    e[i].l = read(), e[i].r = read();
    nex[i] = head[e[i].l];
    Nex[i] = Head[e[i].r];
    head[e[i].l] = i;
    Head[e[i].r] = i;
  }
  for (int i = 1; i <= m; i++) {
    add(1, n, e[i].l, e[i].r, 0, e[i].l & 1 ^ 1, 1, 1);
    add(1, n, e[i].l, e[i].r, 1, e[i].l & 1 ^ 1, 1, 1);
    if (((e[i].r - e[i].l) & 1) && (e[i].r < n)) {
      for (int j = 0; j < 2; j++)
        for (int k = 0; k < 2; k++) add(1, n, e[i].r + 1, n, j, k, 1, 1);
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = head[i]; j; j = nex[j]) workl(e[j].l, e[j].r);
    for (int j = Head[i - 1]; j; j = Nex[j]) workr(e[j].l, e[j].r);
    query(1, n, i, 1);
  }
  for (int i = 1; i <= m; i++) sum[e[i].l]++, sum[e[i].r + 1]--;
  for (int i = 1; i <= n; i++) sum[i] += sum[i - 1];
  int last = 0;
  for (int i = 1; i <= n; i++)
    if (sum[i] == 0)
      last++, ans -= 1LL * last * (last + 1) / 2;
    else
      last = 0;
  printf("%I64d", ans);
}
