#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
const long long int MAXN = 1e5 + 15, md = 1e9 + 7, inf = 2e9;
long long int tav(long long int n, long long int k) {
  long long int res = 1;
  while (k > 0) {
    if (k & 1) {
      res *= n;
      res %= md;
    }
    n *= n;
    n %= md;
    k >>= 1;
  }
  return res;
}
struct segtree {
  long long int sz = 1;
  vector<long long int> val, laz;
  void init(long long int n) {
    while (sz < n) sz <<= 1;
    val.assign(2 * sz, 0);
    laz.assign(2 * sz, 0);
    return;
  }
  void shift(long long int x, long long int lx, long long int rx) {
    if (!laz[x]) return;
    laz[x] = 0;
    val[x] = rx - lx - val[x];
    if (rx - lx == 1) return;
    long long int ln = 2 * x + 1, rn = ln + 1;
    laz[ln] ^= 1;
    laz[rn] ^= 1;
    return;
  }
  void swap(long long int l, long long int r, long long int x, long long int lx,
            long long int rx) {
    shift(x, lx, rx);
    if (rx <= l || lx >= r) return;
    if (rx <= r && lx >= l) {
      laz[x] = 1;
      shift(x, lx, rx);
      return;
    }
    long long int m = (rx + lx) / 2, ln = 2 * x + 1, rn = ln + 1;
    swap(l, r, ln, lx, m);
    swap(l, r, rn, m, rx);
    val[x] = val[ln] + val[rn];
    return;
  }
  void swap(long long int l, long long int r) {
    if (r <= l) return;
    swap(l, r, 0, 0, sz);
    return;
  }
  long long int cal(long long int l, long long int r, long long int x,
                    long long int lx, long long int rx) {
    shift(x, lx, rx);
    if (rx <= l || lx >= r) return 0;
    if (rx <= r && lx >= l) return val[x];
    long long int m = (rx + lx) / 2, ln = 2 * x + 1, rn = ln + 1;
    long long int a, b;
    a = cal(l, r, ln, lx, m);
    b = cal(l, r, rn, m, rx);
    return a + b;
  }
  long long int cal(long long int l, long long int r) {
    if (r <= l) return 0;
    return cal(l, r, 0, 0, sz);
  }
};
segtree st;
vector<long long int> v;
vector<pair<long long int, long long int> > qe, eq;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long int n, k, h, ans = 0;
  cin >> n >> k;
  ans = 1ll * n * (n - 1) * (n - 2) / 6;
  for (long long int i = 0; i < n; i++) {
    cin >> h;
    v.push_back(h);
  }
  sort(v.begin(), v.end());
  for (long long int i = 0; i < k; i++) {
    long long int a, b, l, r;
    cin >> a >> b;
    l = lower_bound(v.begin(), v.end(), a) - v.begin();
    r = upper_bound(v.begin(), v.end(), b) - v.begin();
    qe.push_back({l, r});
    eq.push_back({r, l});
  }
  sort(eq.begin(), eq.end());
  sort(qe.begin(), qe.end());
  eq.push_back({inf, inf});
  qe.push_back({inf, inf});
  st.init(n);
  long long int x = 0, y = 0;
  for (long long int i = 0; i < n; i++) {
    while (qe[x].first == i) {
      st.swap(qe[x].first, qe[x].second);
      x++;
    }
    while (eq[y].first == i) {
      st.swap(eq[y].second, eq[y].first);
      y++;
    }
    long long int d = i;
    d -= st.cal(0, i);
    d += st.cal(i + 1, n);
    ans -= 1ll * d * (d - 1) / 2;
  }
  cout << ans << '\n';
  return 0;
}
