#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e6 + 100;
const long long inf = 0x3f3f3f3f;
const long long iinf = 1 << 30;
const long long linf = 2e18;
const long long mod = 998244353;
const double eps = 1e-7;
template <class T = long long>
T chmin(T &a, T b) {
  return a = min(a, b);
}
template <class T = long long>
T chmax(T &a, T b) {
  return a = max(a, b);
}
template <class T = long long>
T read() {
  T f = 1, a = 0;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    a = (a << 3) + (a << 1) + ch - '0';
    ch = getchar();
  }
  return a * f;
}
long long n, m, ans;
long long a[maxn];
pair<long long, long long> l[maxn], r[maxn];
struct node {
  long long l, r;
  long long sum[2], tag;
} tr[maxn];
void build(long long tot, long long l, long long r) {
  tr[tot].l = l, tr[tot].r = r, tr[tot].sum[0] = r - l + 1;
  if (l == r) return;
  build((tot << 1), l, ((tr[tot].l + tr[tot].r) >> 1)),
      build(((tot << 1) | 1), ((tr[tot].l + tr[tot].r) >> 1) + 1, r);
}
void stag(long long tot) {
  swap(tr[tot].sum[0], tr[tot].sum[1]);
  tr[tot].tag ^= 1;
}
void pushdown(long long tot) {
  if (tr[tot].tag) {
    stag((tot << 1)), stag(((tot << 1) | 1));
    tr[tot].tag = 0;
  }
}
void maintain(long long tot) {
  tr[tot].sum[0] = tr[(tot << 1)].sum[0] + tr[((tot << 1) | 1)].sum[0];
  tr[tot].sum[1] = tr[(tot << 1)].sum[1] + tr[((tot << 1) | 1)].sum[1];
}
void modify(long long tot, long long l, long long r) {
  if (l > r) return;
  if (tr[tot].l >= l && tr[tot].r <= r) return (void)(stag(tot));
  pushdown(tot);
  if (l <= ((tr[tot].l + tr[tot].r) >> 1)) modify((tot << 1), l, r);
  if (r > ((tr[tot].l + tr[tot].r) >> 1)) modify(((tot << 1) | 1), l, r);
  maintain(tot);
}
long long query(long long tot, long long l, long long r, long long typ) {
  if (l > r) return 0;
  if (tr[tot].l >= l && tr[tot].r <= r) return tr[tot].sum[typ];
  pushdown(tot);
  long long ret = 0;
  if (l <= ((tr[tot].l + tr[tot].r) >> 1)) ret += query((tot << 1), l, r, typ);
  if (r > ((tr[tot].l + tr[tot].r) >> 1))
    ret += query(((tot << 1) | 1), l, r, typ);
  return ret;
}
void write(long long tot) {
  if (tr[tot].l == tr[tot].r) return (void)(printf("%lld ", tr[tot].sum[1]));
  pushdown(tot);
  write((tot << 1)), write(((tot << 1) | 1));
}
signed main() {
  n = read(), m = read();
  for (long long i = (1); i <= (n); ++i) a[i] = read();
  sort(a + 1, a + n + 1);
  build(1, 1, n);
  for (long long i = (1); i <= (m); ++i) {
    long long u = read(), v = read();
    u = lower_bound(a + 1, a + n + 1, u) - a;
    v = upper_bound(a + 1, a + n + 1, v) - a - 1;
    l[i] = make_pair(u, v), r[i] = make_pair(v, u);
  }
  sort(l + 1, l + m + 1), sort(r + 1, r + m + 1);
  long long pos1 = 1, pos2 = 1;
  for (long long i = (1); i <= (n); ++i) {
    while (pos1 <= m && l[pos1].first <= i)
      modify(1, l[pos1].first, l[pos1].second), pos1++;
    long long tmp = 0;
    tmp += query(1, 1, i - 1, 0) + query(1, i + 1, n, 1);
    ans += tmp * (tmp - 1) / 2;
    while (pos2 <= m && r[pos2].first <= i)
      modify(1, r[pos2].second, r[pos2].first), pos2++;
  }
  printf("%lld\n", n * (n - 1) * (n - 2) / 6 - ans);
  return 0;
}
