#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
long long node[4 * N][2], lazy[4 * N], s[N], ans, n, k;
vector<pair<long long, long long> > lines[N];
vector<int> num;
void propagate(int tag) {
  if (lazy[tag] % 2 == 0) return;
  swap(node[tag * 2][0], node[tag * 2][1]);
  swap(node[tag * 2 + 1][0], node[tag * 2 + 1][1]);
  lazy[tag] = 0;
  lazy[tag * 2]++;
  lazy[tag * 2 + 1]++;
}
void modify(int tag, int L, int R, int s, int e) {
  if (e <= L || s >= R) return;
  if (s <= L && e >= R) {
    swap(node[tag][0], node[tag][1]);
    lazy[tag]++;
    return;
  }
  propagate(tag);
  modify(tag * 2, L, (L + R) / 2, s, e);
  modify(tag * 2 + 1, (R + L) / 2, R, s, e);
  node[tag][0] = node[tag * 2][0] + node[tag * 2 + 1][0];
  node[tag][1] = node[tag * 2][1] + node[tag * 2 + 1][1];
}
int get_val(int tag, int L, int R, int s, int e) {
  if (e <= L || s >= R)
    return 0;
  else if (L == R - 1)
    return node[tag][1];
  propagate(tag);
  return get_val(tag * 2 + 1, (L + R) / 2, R, s, e) +
         get_val(tag * 2, L, (L + R) / 2, s, e);
}
void make_tree(int tag, int L, int R) {
  if (L == R - 1) {
    node[tag][0] = R - L;
    return;
  }
  node[tag][0] = R - L;
  make_tree(tag * 2, L, (L + R) / 2);
  make_tree(tag * 2 + 1, (L + R) / 2, R);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    num.push_back(x);
    if (i > 0) {
      lines[i].push_back(make_pair(0, i));
      lines[i + 1].push_back(make_pair(0, i));
    }
  }
  sort(num.begin(), num.end());
  for (int i = 0; i < k; i++) {
    int x, y, l, r;
    cin >> x >> y;
    l = lower_bound(num.begin(), num.end(), x) - num.begin();
    r = lower_bound(num.begin(), num.end(), y) - num.begin();
    if (l == n) continue;
    if (r != n && num[r] == y) r++;
    lines[l].push_back(make_pair(l, r));
    lines[r].push_back(make_pair(l, r));
  }
  make_tree(1, 0, n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < lines[i].size(); j++)
      modify(1, 0, n, lines[i][j].first, lines[i][j].second);
    long long crnt = node[1][1] - get_val(1, 0, n, i, i + 1);
    ans += (crnt * (crnt - 1)) / 2;
  }
  ans = (n * (n - 1) * (n - 2)) / (2 * 3) - ans;
  cout << ans;
}
