#include <bits/stdc++.h>
char ch;
inline void read(int &x) {
  x = 0;
  ch = getchar();
  while (ch <= 32) ch = getchar();
  while (ch > 32) {
    x = x * 10 + ch - 48;
    ch = getchar();
  };
};
int n, k;
int s[100005];
int l[100005], r[100005];
struct edge {
  edge *next;
  int y;
} * se[100005], e[100005], *etot = e;
inline void addedge(int x, int y) {
  *++etot = (edge){se[x], y};
  se[x] = etot;
};
struct segnode {
  segnode *l, *r;
  int sum, tag;
  inline void addtag(int size) {
    tag ^= 1;
    sum = size - sum;
  };
  inline void down(int s1, int s2) {
    if (tag) {
      l->addtag(s1);
      r->addtag(s2);
      tag = 0;
    };
  };
  inline void update() { sum = l->sum + r->sum; };
};
segnode _seg[100005 * 2], *stot = _seg;
inline segnode *build(int n) {
  segnode *ret = ++stot;
  ret->sum = n;
  ret->tag = 0;
  if (n > 1) {
    int mid = n >> 1;
    ret->l = build(mid);
    ret->r = build(n - mid);
  };
  return ret;
};
inline void modify(segnode *a, int l, int r, int n) {
  if (l == 1 && r == n) {
    a->addtag(n);
    return;
  };
  int mid = n >> 1;
  a->down(mid, n - mid);
  if (r <= mid) {
    modify(a->l, l, r, mid);
  } else if (l > mid) {
    modify(a->r, l - mid, r - mid, n - mid);
  } else {
    modify(a->l, l, mid, mid);
    modify(a->r, 1, r - mid, n - mid);
  };
  a->update();
};
inline int query(segnode *a, int l, int r, int n) {
  if (l == 1 && r == n) return a->sum;
  int mid = n >> 1;
  a->down(mid, n - mid);
  if (r <= mid) {
    return query(a->l, l, r, mid);
  } else if (l > mid) {
    return query(a->r, l - mid, r - mid, n - mid);
  } else {
    return query(a->l, l, mid, mid) + query(a->r, 1, r - mid, n - mid);
  };
};
int cnt[100005];
int main() {
  read(n);
  read(k);
  int i;
  for (i = 1; i <= n; i++) read(s[i]);
  std::sort(s + 1, s + n + 1);
  for (i = 1; i <= k; i++) {
    int a, b;
    read(a);
    read(b);
    int l = std::lower_bound(s + 1, s + n + 1, a) - s;
    int r = std::upper_bound(s + 1, s + n + 1, b) - s - 1;
    ::l[i] = l;
    ::r[i] = r;
    if (l <= r) addedge(r, l);
  };
  segnode *root = build(n);
  long long ans = 1LL * n * (n - 1) * (n - 2) / 6LL;
  for (i = n; i >= 2; i--) {
    edge *te = se[i];
    while (te) {
      int ty = te->y;
      modify(root, ty, i, n);
      te = te->next;
    };
    int t = query(root, 1, i - 1, n);
    cnt[i] += t;
  };
  etot = e;
  memset(se, 0, sizeof(se));
  for (i = 1; i <= k; i++) {
    if (l[i] <= r[i]) addedge(l[i], r[i]);
  };
  stot = _seg;
  root = build(n);
  modify(root, 1, n, n);
  for (i = 1; i < n; i++) {
    edge *te = se[i];
    while (te) {
      int ty = te->y;
      modify(root, i, ty, n);
      te = te->next;
    };
    int t = query(root, i + 1, n, n);
    cnt[i] += t;
  };
  for (i = 1; i <= n; i++) {
    ans -= 1LL * cnt[i] * (cnt[i] - 1) / 2LL;
  };
  printf("%I64d\n", ans);
}
