#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
long long sl[maxn], sr[maxn];
vector<int> vl[maxn];
vector<int> vr[maxn];
int lft[maxn << 1], rht[maxn << 1], lz[maxn << 1], s[maxn << 1];
void build(int n, int l, int r) {
  lft[n] = l, rht[n] = r;
  lz[n] = s[n] = 0;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(n << 1, l, mid);
  build((n << 1) + 1, mid + 1, r);
}
void push(int n) {
  int l = (n << 1), r = l + 1;
  if (!lz[n]) return;
  lz[n] = 0;
  lz[l] ^= 1, lz[r] ^= 1;
  s[l] = rht[l] - lft[l] + 1 - s[l];
  s[r] = rht[r] - lft[r] + 1 - s[r];
}
void upd(int n, int l, int r) {
  if (lft[n] == l && rht[n] == r) {
    s[n] = r - l + 1 - s[n];
    lz[n] ^= 1;
    return;
  }
  push(n);
  int mid = (lft[n] + rht[n]) / 2;
  if (r <= mid)
    upd(n << 1, l, r);
  else if (l > mid)
    upd((n << 1) + 1, l, r);
  else
    upd(n << 1, l, mid), upd((n << 1) + 1, mid + 1, r);
  s[n] = s[n << 1] + s[(n << 1) + 1];
}
int get(int n, int l, int r) {
  if (lft[n] == l && rht[n] == r) return s[n];
  push(n);
  int mid = (lft[n] + rht[n]) / 2;
  if (r <= mid)
    return get(n << 1, l, r);
  else if (l > mid)
    return get((n << 1) + 1, l, r);
  return get(n << 1, l, mid) + get((n << 1) + 1, mid + 1, r);
}
int si[maxn];
int main() {
  int n, i, j, k;
  cin >> n >> k;
  for (i = 1; i <= n; i++) cin >> si[i];
  sort(si + 1, si + 1 + n);
  int u, v, cnt = 0;
  for (i = 1; i <= k; i++) {
    scanf("%d%d", &u, &v);
    u = lower_bound(si + 1, si + 1 + n, u) - si;
    v = upper_bound(si + 1, si + 1 + n, v) - si - 1;
    if (u > n || v < 1 || u > v) continue;
    vl[v].push_back(u);
    vr[u].push_back(v);
  }
  build(1, 1, n);
  for (i = n; i >= 1; i--) {
    for (j = 0; j < vl[i].size(); j++) upd(1, vl[i][j], i);
    if (i > 1) sl[i] = get(1, 1, i - 1);
  }
  build(1, 1, n);
  for (i = 1; i <= n; i++) {
    for (j = 0; j < vr[i].size(); j++) upd(1, i, vr[i][j]);
    if (i < n) sr[i] = get(1, i + 1, n);
  }
  long long ans = 0;
  for (i = 1; i <= n; i++)
    ans += (sl[i] + n - i - sr[i]) * (sl[i] + n - i - sr[i] - 1) / 2;
  ans = (n + 0ll) * (n - 1ll) * (n - 2ll) / 6 - ans;
  cout << ans << endl;
}
