#include <bits/stdc++.h>
const int N = 100000 + 9;
bool tag[N * 4];
long long ans;
int sum[N * 4], L, R, n, m, left[N], right[N], tl[N], tr[N], a[N];
inline bool cmpl(const int lhs, const int rhs) { return left[lhs] < left[rhs]; }
inline bool cmpr(const int lhs, const int rhs) {
  return right[lhs] < right[rhs];
}
inline void rls(int id, int l, int r, int mid) {
  if (l == r) return;
  tag[id] = 0;
  tag[id * 2] ^= 1;
  tag[id * 2 + 1] ^= 1;
  sum[id * 2] = mid - l + 1 - sum[id * 2];
  sum[id * 2 + 1] = r - mid - sum[id * 2 + 1];
}
void rev(int id, int l, int r) {
  if (L <= l && r <= R) {
    sum[id] = r - l + 1 - sum[id];
    tag[id] ^= 1;
    return;
  }
  int mid = (l + r) / 2;
  if (tag[id]) rls(id, l, r, mid);
  if (L <= mid) rev(id * 2, l, mid);
  if (mid < R) rev(id * 2 + 1, mid + 1, r);
  sum[id] = sum[id * 2] + sum[id * 2 + 1];
}
int query(int id, int l, int r) {
  if (l == r) return sum[id];
  int mid = (l + r) / 2;
  if (tag[id]) rls(id, l, r, mid);
  if (L <= mid)
    return query(id * 2, l, mid);
  else
    return query(id * 2 + 1, mid + 1, r);
}
int main() {
  scanf("%d%d", &n, &m);
  ans = 1ll * n * (n - 1) * (n - 2) / 3 / 2;
  for (int i = 1; i <= n; ++i) scanf("%d", a + i);
  std::sort(a + 1, a + 1 + n);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &left[i], right + i), tl[i] = tr[i] = i;
    left[i] = std::lower_bound(a + 1, a + 1 + n, left[i]) - a;
    right[i] = std::upper_bound(a + 1, a + 1 + n, right[i]) - a - 1;
  }
  std::sort(tl + 1, tl + 1 + m, cmpl);
  std::sort(tr + 1, tr + 1 + m, cmpr);
  for (int i = 1, j = 1, k = 1; i <= n; ++i) {
    while (j <= m && left[tl[j]] <= i) {
      L = left[tl[j]];
      R = right[tl[j]];
      if (L < R) rev(1, 1, n);
      ++j;
    }
    L = i;
    int tmp = query(1, 1, n);
    ans -= 1ll * (sum[1] - tmp) * (sum[1] - 1 - tmp) / 2;
    while (k <= m && right[tr[k]] <= i) {
      L = left[tr[k]];
      R = right[tr[k]];
      if (L < R) rev(1, 1, n);
      ++k;
    }
    L = R = i;
    rev(1, 1, n);
  }
  printf("%I64d\n", ans);
}
