#include <bits/stdc++.h>
using namespace ::std;
const long long maxn = 1e5 + 500;
const long long mod = 1e9 + 7;
const long long inf = 1e9 + 500;
long long a[maxn];
vector<long long> vec[maxn];
vector<long long> sar[maxn];
long long out[maxn];
long long seg[maxn * 4];
bool lazy[maxn * 4];
void shift(long long a, long long tol) {
  if (lazy[a]) {
    long long v = tol / 2;
    lazy[2 * a] = !lazy[2 * a];
    lazy[2 * a + 1] = !lazy[2 * a + 1];
    seg[2 * a] = v - seg[2 * a];
    seg[2 * a + 1] = tol - v - seg[2 * a + 1];
    lazy[a] = 0;
  }
}
void update(long long L, long long R, long long node, long long l,
            long long r) {
  if (l <= L && R <= r) {
    seg[node] = R - L - seg[node];
    lazy[node] = !lazy[node];
    return;
  }
  if (R <= l || r <= L) {
    return;
  }
  shift(node, R - L);
  long long mid = (L + R) / 2;
  update(L, mid, 2 * node, l, r);
  update(mid, R, 2 * node + 1, l, r);
  seg[node] = seg[2 * node] + seg[node * 2 + 1];
}
long long finds(long long L, long long R, long long node, long long l,
                long long r) {
  if (l <= L && R <= r) {
    return seg[node];
  }
  if (R <= l || r <= L) {
    return 0;
  }
  shift(node, R - L);
  long long mid = (L + R) / 2;
  return finds(L, mid, 2 * node, l, r) + finds(mid, R, 2 * node + 1, l, r);
}
long long doaz(long long a) { return a * (a - 1) / 2; }
int main() {
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a, a + n);
  for (long long i = 0; i < m; i++) {
    long long c, b;
    cin >> b >> c;
    b = lower_bound(a, a + n, b) - a;
    c = upper_bound(a, a + n, c) - a - 1;
    if (b != c) {
      vec[b].push_back(c);
      sar[c].push_back(b);
    }
  }
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < vec[i].size(); j++) {
      long long v = vec[i][j];
      update(0, n, 1, i, v + 1);
    }
    out[i] = (n - i - 1) - finds(0, n, 1, i + 1, n);
  }
  fill(lazy, lazy + maxn * 4, 0);
  fill(seg, seg + maxn * 4, 0);
  long long ans = 0;
  for (long long i = n - 1; i >= 0; i--) {
    for (long long j = 0; j < sar[i].size(); j++) {
      long long v = sar[i][j];
      update(0, n, 1, v, i);
    }
    out[i] += finds(0, n, 1, 0, i);
    ans += doaz(out[i]);
  }
  cout << n * (n - 1) * (n - 2) / 6 - ans;
}
