#include <bits/stdc++.h>
using namespace std;
int primero = 1 << 17;
const int tope = 1 << 18;
int cuantos[tope][2];
int ext[tope];
int cuantosext[tope][2];
void recalcula(int pos) {
  if (pos < primero) {
    cuantos[pos][0] = cuantosext[2 * pos][0] + cuantosext[2 * pos + 1][0];
    cuantos[pos][1] = cuantosext[2 * pos][1] + cuantosext[2 * pos + 1][1];
  }
  cuantosext[pos][ext[pos]] = cuantos[pos][0];
  cuantosext[pos][1 ^ ext[pos]] = cuantos[pos][1];
}
void insertarcuantos(int pos) {
  pos += primero;
  cuantos[pos][0] = 1;
  recalcula(pos);
  while (pos > 1) {
    pos /= 2;
    recalcula(pos);
  }
}
void insertar(int inf, int sup) {
  if (inf > sup) return;
  inf += primero;
  sup += primero;
  ext[inf] ^= 1;
  recalcula(inf);
  if (inf < sup) {
    ext[sup] ^= 1;
    recalcula(sup);
    while (not(inf + 1 == sup and inf % 2 == 0)) {
      if (inf % 2 == 0) {
        ext[inf + 1] ^= 1;
        recalcula(inf + 1);
      }
      inf /= 2;
      recalcula(inf);
      if (sup % 2 == 1) {
        ext[sup - 1] ^= 1;
        recalcula(sup - 1);
      }
      sup /= 2;
      recalcula(sup);
    }
  }
  while (inf > 1) {
    inf /= 2;
    recalcula(inf);
  }
}
int cuantosentre(int inf, int sup) {
  if (inf > sup) return 0;
  inf += primero;
  sup += primero;
  int cinf[2], csup[2];
  cinf[0] = cuantosext[inf][0];
  cinf[1] = cuantosext[inf][1];
  csup[0] = cuantosext[sup][0];
  csup[1] = cuantosext[sup][1];
  if (inf < sup) {
    while (not(inf + 1 == sup and inf % 2 == 0)) {
      if (inf % 2 == 0) {
        cinf[0] += cuantosext[inf + 1][0];
        cinf[1] += cuantosext[inf + 1][1];
      }
      inf /= 2;
      if (ext[inf]) swap(cinf[0], cinf[1]);
      if (sup % 2 == 1) {
        csup[0] += cuantosext[sup - 1][0];
        csup[1] += cuantosext[sup - 1][1];
      }
      sup /= 2;
      if (ext[sup]) swap(csup[0], csup[1]);
    }
    cinf[0] += csup[0];
    cinf[1] += csup[1];
  }
  while (inf > 1) {
    inf /= 2;
    if (ext[inf]) swap(cinf[0], cinf[1]);
  }
  return cinf[0];
}
long long int combi[1000000][4];
vector<int> entra[1000000];
vector<int> sale[1000000];
map<int, int> mapa;
int main() {
  ios::sync_with_stdio(false);
  {
    for (int n = 0; n < 1000000; n++)
      for (int k = 0; k <= n and k < 4; k++)
        if (k == 0 or k == n)
          combi[n][k] = 1;
        else
          combi[n][k] = combi[n - 1][k] + combi[n - 1][k - 1];
  }
  int n, k;
  cin >> n >> k;
  for (int i = 1; i <= n; i++) {
    int x;
    cin >> x;
    mapa[x];
  }
  {
    int i = 1;
    for (map<int, int>::iterator it = mapa.begin(); it != mapa.end(); it++, i++)
      it->second = i;
  }
  for (int i = 1; i <= n; i++) insertarcuantos(i);
  for (int i = 0; i < k; i++) {
    int l, r;
    cin >> l >> r;
    {
      map<int, int>::iterator it = mapa.lower_bound(l);
      if (it == mapa.end())
        continue;
      else
        l = it->second;
    }
    {
      map<int, int>::iterator it = mapa.upper_bound(r);
      if (it == mapa.begin())
        continue;
      else {
        it--;
        r = it->second;
      }
    }
    if (l > r) continue;
    entra[l].push_back(r);
    sale[r].push_back(l);
  }
  long long int s = 0;
  for (int i = 1; i <= n; i++) {
    {
      vector<int> &v = entra[i];
      for (int j = 0; j < int(v.size()); j++) insertar(i, v[j]);
    }
    s = s + combi[cuantosentre(1, i - 1) + n - i - cuantosentre(i + 1, n)][2];
    {
      vector<int> &v = sale[i];
      for (int j = 0; j < int(v.size()); j++) insertar(v[j], i);
    }
  }
  cout << combi[n][3] - s << endl;
}
