#include <bits/stdc++.h>
using namespace std;
int n, k, a, b, L, R, cnt, d;
int s[100005];
struct qu {
  int pos, l, r;
} q[200005];
int sum[1600005][2], bj[1600005];
long long ans;
int cmp(qu u, qu v) { return u.pos < v.pos; }
void build(int x, int l, int r) {
  sum[x][0] = r - l + 1;
  bj[x] = sum[x][1] = 0;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(2 * x, l, mid);
  build(2 * x + 1, mid + 1, r);
}
void pushdown(int x) {
  swap(sum[x][0], sum[x][1]);
  bj[2 * x] ^= 1;
  bj[2 * x + 1] ^= 1;
  bj[x] = 0;
}
void updata(int x, int l, int r, int nl, int nr) {
  if (bj[x]) pushdown(x);
  if (l > nr || r < nl) return;
  if (l >= nl && r <= nr) {
    bj[x] ^= 1;
    pushdown(x);
    return;
  }
  int mid = (l + r) / 2;
  updata(2 * x, l, mid, nl, nr);
  updata(2 * x + 1, mid + 1, r, nl, nr);
  for (int i = 0; i < 2; i++) sum[x][i] = sum[2 * x][i] + sum[2 * x + 1][i];
}
int query(int x, int l, int r, int nl, int nr, int id) {
  if (bj[x]) pushdown(x);
  if (l > nr || r < nl) return 0;
  if (l >= nl && r <= nr) return sum[x][id];
  int mid = (l + r) / 2;
  return query(2 * x, l, mid, nl, nr, id) +
         query(2 * x + 1, mid + 1, r, nl, nr, id);
}
int main() {
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= n; i++) scanf("%d", &s[i]);
  sort(s + 1, s + n + 1);
  for (int i = 1, l, r; i <= k; i++) {
    scanf("%d %d", &a, &b);
    l = 1, r = n, L = n + 1;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (s[mid] >= a)
        L = min(L, mid), r = mid - 1;
      else
        l = mid + 1;
    }
    l = 1, r = n, R = 0;
    while (l <= r) {
      int mid = (l + r) / 2;
      if (s[mid] <= b)
        R = max(R, mid), l = mid + 1;
      else
        r = mid - 1;
    }
    if (L <= R) {
      q[++cnt] = (qu){L, L, R};
      if (R + 1 <= n) q[++cnt] = (qu){R + 1, L, R};
    }
  }
  sort(q + 1, q + cnt + 1, cmp);
  build(1, 1, n);
  R = 1;
  ans = 1ll * n * (n - 1) * (n - 2) / 6;
  for (int i = 1; i <= n; i++) {
    while (R <= cnt && q[R].pos == i) updata(1, 1, n, q[R].l, q[R].r), R++;
    d = 0;
    if (i > 1) d += query(1, 1, n, 1, i - 1, 0);
    if (i < n) d += query(1, 1, n, i + 1, n, 1);
    ans -= 1ll * d * (d - 1) / 2;
  }
  printf("%lld\n", ans);
  return 0;
}
