#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const int mod = 1000000007;
template <class T>
inline void read(T& x) {
  bool fu = 0;
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') fu = 1, c = getchar();
  for (x = 0; c > 32; c = getchar()) x = x * 10 + c - '0';
  if (fu) x = -x;
};
template <class T>
inline void read(T& x, T& y) {
  read(x);
  read(y);
}
template <class T>
inline void read(T& x, T& y, T& z) {
  read(x);
  read(y);
  read(z);
}
template <class T>
inline void read(T& x, T& y, T& z, T& q) {
  read(x);
  read(y);
  read(z);
  read(q);
}
const int DX[] = {1, 0, -1, 0}, DY[] = {0, 1, 0, -1};
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long powmod(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
const int N = 111111, M = 3111111;
int l, m, n, t, C, a[N], x, y, tot, pt[N];
vector<pair<int, int> > vec[N];
struct SEG {
  int lc, rc, v, rev, sz;
} T[M];
void push(int x) {
  if (T[x].rev)
    T[T[x].lc].rev ^= 1, T[T[x].rc].rev ^= 1, T[x].v = T[x].sz - T[x].v,
                                              T[x].rev = 0;
}
void upd(int x) {
  push(T[x].lc);
  push(T[x].rc);
  T[x].v = T[T[x].lc].v + T[T[x].rc].v;
  T[x].sz = T[T[x].lc].sz + T[T[x].rc].sz;
}
int creat(int l, int r) {
  T[++tot].sz = 1;
  if (l == r) return tot;
  int mid = l + r >> 1, tmp = tot;
  T[tmp].lc = creat(l, mid);
  T[tmp].rc = creat(mid + 1, r);
  upd(tmp);
  return tmp;
}
void flip(int p, int L, int R, int l, int r) {
  if (l == L && r == R) {
    T[p].rev ^= 1;
    push(p);
    return;
  }
  push(p);
  int mid = L + R >> 1;
  if (l <= mid) flip(T[p].lc, L, mid, l, min(r, mid));
  if (r > mid) flip(T[p].rc, mid + 1, R, max(l, mid + 1), r);
  upd(p);
}
int ask(int p, int L, int R, int l, int r) {
  if (l > r) return 0;
  push(p);
  if (l == L && r == R) return T[p].v;
  int mid = L + R >> 1, ans = 0;
  if (l <= mid) ans += ask(T[p].lc, L, mid, l, min(r, mid));
  if (r > mid) ans += ask(T[p].rc, mid + 1, R, max(l, mid + 1), r);
  upd(p);
  return ans;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (n); ++i) scanf("%d", &a[i]);
  sort(a + 1, a + 1 + n);
  a[n + 1] = inf;
  for (int i = (1); i <= (m); ++i) {
    scanf("%d%d", &x, &y), x = lower_bound(a + 1, a + 1 + n, x) - a,
                           y = upper_bound(a + 1, a + 2 + n, y) - a - 1;
    if (x > y) continue;
    vec[x].push_back(make_pair(x, y)), vec[y + 1].push_back(make_pair(x, y));
  }
  long long ans = 1ll * n * (n - 1) * (n - 2) / 6;
  creat(1, n);
  for (int i = (1); i <= (n); ++i) {
    for (int _ = (0); _ <= (((int)(vec[i]).size()) - 1); ++_)
      flip(1, 1, n, vec[i][_].first, vec[i][_].second);
    int tmp = i - 1 - ask(1, 1, n, 1, i - 1) + ask(1, 1, n, i + 1, n);
    ans -= 1ll * tmp * (tmp - 1) / 2;
  }
  printf("%I64d\n", ans);
  return 0;
}
