#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
struct ope {
  int l, r;
} op[N];
int sum[4 * N], rev[4 * N], du[N], a[N], b[N], c[N], n, m, top;
long long ans = 0;
bool cmp(ope x, ope y) { return x.l < y.l; }
bool cmp2(ope x, ope y) { return x.r > y.r; }
int bin1(int x) {
  int l = 1, r = top, mid, res = top + 1;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (c[mid] >= x)
      res = mid, r = mid - 1;
    else
      l = mid + 1;
  }
  return res;
}
int bin2(int x) {
  int l = 1, r = top, mid, res = 0;
  while (l <= r) {
    mid = (l + r) >> 1;
    if (c[mid] <= x)
      res = mid, l = mid + 1;
    else
      r = mid - 1;
  }
  return res;
}
void upd(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; }
void push(int rt, int l, int mid, int r) {
  if (rev[rt]) {
    rev[rt << 1] ^= 1;
    rev[rt << 1 | 1] ^= 1;
    sum[rt << 1] = mid - l + 1 - sum[rt << 1];
    sum[rt << 1 | 1] = r - mid - sum[rt << 1 | 1];
    rev[rt] ^= 1;
  }
}
void cg(int l, int r, int rt, int cl, int cr) {
  if (cl > cr) return;
  if ((cl <= l) && (r <= cr)) {
    rev[rt] ^= 1;
    sum[rt] = r - l + 1 - sum[rt];
    return;
  }
  int mid = (l + r) >> 1;
  push(rt, l, mid, r);
  if (cl <= mid) cg(l, mid, rt << 1, cl, cr);
  if (cr > mid) cg(mid + 1, r, rt << 1 | 1, cl, cr);
  upd(rt);
}
int ask(int l, int r, int rt, int ql, int qr) {
  if (ql > qr) return 0;
  if ((ql <= l) && (r <= qr)) return sum[rt];
  int mid = (l + r) >> 1, res = 0;
  push(rt, l, mid, r);
  if (ql <= mid) res += ask(l, mid, rt << 1, ql, qr);
  if (qr > mid) res += ask(mid + 1, r, rt << 1 | 1, ql, qr);
  upd(rt);
  return res;
}
int main() {
  int i, j, k, x, y;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  sort(a + 1, a + n + 1);
  top = 0;
  for (i = 1; i <= n; i++) {
    if (a[i] == a[i - 1])
      b[i] = top;
    else
      b[i] = ++top, c[top] = a[i];
  }
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    x = bin1(x);
    y = bin2(y);
    op[i].l = x;
    op[i].r = y;
  }
  sort(op + 1, op + m + 1, cmp);
  for (i = 1; i <= n; i++) du[i] = i - 1;
  op[m + 1].l = top + 1;
  for (i = 1; i <= m; i++) {
    if (op[i].l == top + 1) break;
    cg(1, top, 1, op[i].l, op[i].r);
    if (op[i].l != op[i + 1].l)
      for (j = op[i].l; j < op[i + 1].l; j++)
        du[j] += ask(1, top, 1, j + 1, top);
  }
  memset(sum, 0, sizeof(sum));
  memset(rev, 0, sizeof(rev));
  sort(op + 1, op + m + 1, cmp2);
  op[m + 1].r = 0;
  for (i = 1; i <= m; i++) {
    if (op[i].r == 0) break;
    cg(1, top, 1, op[i].l, op[i].r);
    if (op[i].r != op[i + 1].r)
      for (j = op[i].r; j > op[i + 1].r; j--) du[j] -= ask(1, top, 1, 1, j - 1);
  }
  ans = (long long)n * (long long)(n - 1) * (long long)(n - 2) / 6;
  for (i = 1; i <= n; i++)
    if (du[i] >= 2) ans -= (long long)du[i] * (long long)(du[i] - 1) / 2;
  cout << ans << endl;
  return 0;
}
