#include <bits/stdc++.h>
using namespace std;
long long int n, k;
long long int s[524300], l[524300], r[524300];
class Graph {
 public:
  long long int node[524300], next[524300], to[524300];
  long long int e;
  void ins(long long int x, long long int y) {
    e++;
    next[e] = node[x];
    node[x] = e;
    to[e] = y;
  }
} Gl, Gr;
long long int cyb(long long int x) {
  long long int l = 0, r = n, mid;
  while (r - l > 1) {
    mid = (l + r) >> 1;
    if (s[mid] > x)
      r = mid;
    else
      l = mid;
  }
  if (s[r] <= x)
    return r;
  else
    return l;
}
void gi(long long int &x) {
  char ch = getchar();
  x = 0;
  while (ch < '0' || ch > '9') ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar();
}
long long int dep[524300], chi[524300];
void init() {
  long long int i, j;
  gi(n);
  gi(k);
  for (i = 1; i <= n; i++) gi(s[i]);
  sort(s + 1, s + n + 1);
  for (i = 1; i <= k; i++)
    gi(l[i]), gi(r[i]), l[i] = cyb(l[i] - 1) + 1, r[i] = cyb(r[i]);
  for (i = 1; i <= k; i++) Gl.ins(l[i], r[i]), Gr.ins(r[i], l[i]);
  for (i = 1; i <= 524296; i++) dep[i] = dep[i >> 1] + 1;
}
class Data_Structure {
 public:
  long long int T[524300], bj[524300];
  long long int tn;
  void clr() {
    long long int i;
    for (i = 1; i <= tn + tn + 1; i++) T[i] = bj[i] = 0;
  }
  void up(long long int x) {
    for (long long int i = x >> 1; i; i >>= 1) T[i] = T[i << 1] + T[i << 1 | 1];
  }
  void down(long long int x) {
    long long int i, v;
    for (i = dep[x]; i; i--) {
      v = x >> i;
      if (bj[v]) {
        T[v << 1] = chi[v << 1] - T[v << 1];
        T[v << 1 | 1] = chi[v << 1 | 1] - T[v << 1 | 1];
        bj[v << 1] ^= 1, bj[v << 1 | 1] ^= 1, bj[v] = 0;
      }
    }
  }
  long long int f_s(long long int s, long long int t) {
    for (; s ^ t ^ 1; s >>= 1, t >>= 1)
      if (~s & 1) return s ^ 1;
    return 0;
  }
  long long int f_t(long long int s, long long int t) {
    for (; s ^ t ^ 1; s >>= 1, t >>= 1)
      if (t & 1) return t ^ 1;
    return 0;
  }
  void ins(long long int l, long long int r) {
    long long int s = l + tn - 1, t = r + tn + 1;
    long long int ss = f_s(s, t), tt = f_t(s, t);
    down(ss);
    down(tt);
    for (; s ^ t ^ 1; s >>= 1, t >>= 1) {
      if (~s & 1) bj[s ^ 1] ^= 1, T[s ^ 1] = chi[s ^ 1] - T[s ^ 1];
      if (t & 1) bj[t ^ 1] ^= 1, T[t ^ 1] = chi[t ^ 1] - T[t ^ 1];
    }
    up(ss);
    up(tt);
  }
  long long int count(long long int l, long long int r) {
    long long int s = l + tn - 1, t = r + tn + 1, ans = 0;
    long long int ss = f_s(s, t), tt = f_t(s, t);
    down(ss);
    down(tt);
    for (; s ^ t ^ 1; s >>= 1, t >>= 1) {
      if (~s & 1) ans += T[s ^ 1];
      if (t & 1) ans += T[t ^ 1];
    }
    return ans;
  }
} Ds;
long long int in[524300];
void doit1() {
  long long int i, j;
  Ds.clr();
  for (i = 1; i <= n; i++) {
    for (long long int codeforces = Gr.node[i - 1], j = Gr.to[codeforces];
         codeforces; codeforces = Gr.next[codeforces], j = Gr.to[codeforces])
      Ds.ins(j, i - 1);
    for (long long int codeforces = Gl.node[i], j = Gl.to[codeforces];
         codeforces; codeforces = Gl.next[codeforces], j = Gl.to[codeforces])
      Ds.ins(i, j);
    in[i] += i - 1 - Ds.count(1, i - 1);
  }
}
void doit2() {
  long long int i, j;
  Ds.clr();
  for (i = n; i; i--) {
    for (long long int codeforces = Gl.node[i + 1], j = Gl.to[codeforces];
         codeforces; codeforces = Gl.next[codeforces], j = Gl.to[codeforces])
      Ds.ins(i + 1, j);
    for (long long int codeforces = Gr.node[i], j = Gr.to[codeforces];
         codeforces; codeforces = Gr.next[codeforces], j = Gr.to[codeforces])
      Ds.ins(j, i);
    in[i] += Ds.count(i + 1, n);
  }
}
void print() {
  long long int i;
  long long int ans = n;
  ans = (ans * (ans - 1) * (ans - 2)) / 3;
  for (i = 1; i <= n; i++) ans -= in[i] * (in[i] - 1);
  cout << (ans >> 1);
}
int main() {
  long long int i;
  init();
  for (Ds.tn = 1; Ds.tn <= n; Ds.tn <<= 1)
    ;
  Ds.tn--;
  for (i = Ds.tn + 1; i <= Ds.tn + n; i++) chi[i] = 1;
  for (i = Ds.tn; i; i--) chi[i] = chi[i << 1] + chi[i << 1 | 1];
  doit1();
  doit2();
  print();
  return 0;
}
