#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 500;
const int inf = 1e9 + 5;
struct node {
  int l, r;
} b[N];
bool cmp(node a, node b) { return a.l < b.l; }
bool rcmp(node a, node b) { return a.r > b.r; }
int n, m, a[N], cnt, rt, ls[N * 32], rs[N * 32], sz[N * 32], vl[N * 32], Big[N],
    Small[N], flag, b1[N], b2[N];
bool tag[N * 32];
void add(int &x, int l, int r, int pos) {
  if (!x) x = ++cnt;
  sz[x]++;
  vl[x]++;
  if (l == r) return;
  int mi = (l + r) >> 1;
  if (pos <= mi)
    add(ls[x], l, mi, pos);
  else
    add(rs[x], mi + 1, r, pos);
}
void Pd(int x) {
  if (x) tag[x] ^= 1, vl[x] = sz[x] - vl[x];
}
void pd(int x) {
  if (tag[x]) Pd(ls[x]), Pd(rs[x]), tag[x] = 0;
}
void modify(int x, int l, int r, int pos) {
  if (!x) return;
  if (r <= pos) {
    Pd(x);
    return;
  }
  int mi = (l + r) >> 1;
  pd(x);
  modify(ls[x], l, mi, pos);
  if (mi < pos) modify(rs[x], mi + 1, r, pos);
  vl[x] = vl[ls[x]] + vl[rs[x]];
}
int ask(int x, int l, int r, int pos) {
  if (!x) return 0;
  if (l >= pos) return vl[x];
  int mi = (l + r) >> 1, ans = 0;
  pd(x);
  if (pos <= mi) ans += ask(ls[x], l, mi, pos);
  ans += ask(rs[x], mi + 1, r, pos);
  return ans;
}
void modifyy(int x, int l, int r, int pos) {
  if (!x) return;
  if (l >= pos) {
    Pd(x);
    return;
  }
  int mi = (l + r) >> 1;
  pd(x);
  if (pos <= mi) modifyy(ls[x], l, mi, pos);
  modifyy(rs[x], mi + 1, r, pos);
  vl[x] = vl[ls[x]] + vl[rs[x]];
}
int askk(int x, int l, int r, int pos) {
  if (!x) return 0;
  if (r <= pos) return vl[x];
  int mi = (l + r) >> 1, ans = 0;
  pd(x);
  ans += askk(ls[x], l, mi, pos);
  if (mi < pos) ans += askk(rs[x], mi + 1, r, pos);
  return ans;
}
int main() {
  scanf("%d%d", &n, &m);
  long long ans = 1ll * n * (n - 1) / 2 * (n - 2) / 3;
  long long spc = 0;
  for (int i = 1; i <= n; i++) scanf("%d", a + i);
  for (int i = 1; i <= m; i++) scanf("%d%d", &b[i].l, &b[i].r);
  sort(b + 1, b + m + 1, cmp);
  sort(a + 1, a + n + 1);
  for (int i = 1, j = 1; i <= n; i = j) {
    while (j <= n && a[i] == a[j]) ++j;
    for (int k = i; k <= j - 1; k++) b1[k] = j - k - 1, b2[k] = k - i;
    ans -= 1ll * (j - i) * (j - i - 1) / 2 * (j - i - 2) / 3;
    spc += 1ll * (j - i) * (j - i - 1) / 2 * (n - j + i);
  }
  cnt = rt = 0;
  for (int i = 1; i <= n; i++) add(rt, 0, inf, a[i]);
  int j = 1;
  for (int i = 1; i <= n; i++) {
    while (j <= m && b[j].l <= a[i]) {
      modify(rt, 0, inf, b[j].r), ++j;
    }
    int t = ask(rt, 0, inf, a[i] + 1);
    Big[i] += t;
    Small[i] += n - i - b1[i] - t;
  }
  cnt = rt = 0;
  memset(sz, 0, sizeof(sz));
  memset(vl, 0, sizeof(vl));
  memset(ls, 0, sizeof(ls));
  memset(rs, 0, sizeof(rs));
  memset(tag, 0, sizeof(tag));
  for (int i = 1; i <= n; i++) add(rt, 0, inf, a[i]);
  sort(b + 1, b + m + 1, rcmp);
  j = 1;
  for (int i = n; i >= 1; i--) {
    while (j <= m && b[j].r >= a[i]) modifyy(rt, 0, inf, b[j].l), ++j;
    int t = askk(rt, 0, inf, a[i] - 1);
    Small[i] += t;
    Big[i] += i - 1 - b2[i] - t;
  }
  long long tmp = 0;
  for (int i = 1; i <= n; i++) {
    tmp += 1ll * Big[i] * (Big[i] - 1) / 2;
    tmp += 1ll * Small[i] * (Small[i] - 1) / 2;
  }
  tmp = (tmp + spc) / 2;
  printf("%I64d\n", ans - tmp);
  return 0;
}
