#include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 500;   const int inf = 1e9 + 5;   struct node {     int l, r;   } b[N];   bool cmp(node a, node b) { return a.l < b.l; }   bool rcmp(node a, node b) { return a.r > b.r; }   int n, m, a[N], cnt, rt, ls[N * 32], rs[N * 32], sz[N * 32], vl[N * 32], Big[N],       Small[N], flag, b1[N], b2[N];   bool tag[N * 32];   void add(int &x, int l, int r, int pos) {     if (!x) x = ++cnt;     sz[x]++;     vl[x]++;     if (l == r) return;     int mi = (l + r) >> 1;     if (pos <= mi)       add(ls[x], l, mi, pos);     else       add(rs[x], mi + 1, r, pos);   }   void Pd(int x) {     if (x) tag[x] ^= 1, vl[x] = sz[x] - vl[x];   }   void pd(int x) {     if (tag[x]) Pd(ls[x]), Pd(rs[x]), tag[x] = 0;   }   void modify(int x, int l, int r, int pos) {     if (!x) return;     if (r <= pos) {       Pd(x);       return;     }     int mi = (l + r) >> 1;     pd(x);     modify(ls[x], l, mi, pos);     if (mi < pos) modify(rs[x], mi + 1, r, pos);     vl[x] = vl[ls[x]] + vl[rs[x]];   }   int ask(int x, int l, int r, int pos) {     if (!x) return 0;     if (l >= pos) return vl[x];     int mi = (l + r) >> 1, ans = 0;     pd(x);     if (pos <= mi) ans += ask(ls[x], l, mi, pos);     ans += ask(rs[x], mi + 1, r, pos);     return ans;   }   void modifyy(int x, int l, int r, int pos) {     if (!x) return;     if (l >= pos) {       Pd(x);       return;     }     int mi = (l + r) >> 1;     pd(x);     if (pos <= mi) modifyy(ls[x], l, mi, pos);     modifyy(rs[x], mi + 1, r, pos);     vl[x] = vl[ls[x]] + vl[rs[x]];   }   int askk(int x, int l, int r, int pos) {     if (!x) return 0;     if (r <= pos) return vl[x];     int mi = (l + r) >> 1, ans = 0;     pd(x);     ans += askk(ls[x], l, mi, pos);     if (mi < pos) ans += askk(rs[x], mi + 1, r, pos);     return ans;   }   int main() {     scanf( %d%d , &n, &m);     long long ans = 1ll * n * (n - 1) / 2 * (n - 2) / 3;     long long spc = 0;     for (int i = 1; i <= n; i++) scanf( %d , a + i);     for (int i = 1; i <= m; i++) scanf( %d%d , &b[i].l, &b[i].r);     sort(b + 1, b + m + 1, cmp);     sort(a + 1, a + n + 1);     for (int i = 1, j = 1; i <= n; i = j) {       while (j <= n && a[i] == a[j]) ++j;       for (int k = i; k <= j - 1; k++) b1[k] = j - k - 1, b2[k] = k - i;       ans -= 1ll * (j - i) * (j - i - 1) / 2 * (j - i - 2) / 3;       spc += 1ll * (j - i) * (j - i - 1) / 2 * (n - j + i);     }     cnt = rt = 0;     for (int i = 1; i <= n; i++) add(rt, 0, inf, a[i]);     int j = 1;     for (int i = 1; i <= n; i++) {       while (j <= m && b[j].l <= a[i]) {         modify(rt, 0, inf, b[j].r), ++j;       }       int t = ask(rt, 0, inf, a[i] + 1);       Big[i] += t;       Small[i] += n - i - b1[i] - t;     }     cnt = rt = 0;     memset(sz, 0, sizeof(sz));     memset(vl, 0, sizeof(vl));     memset(ls, 0, sizeof(ls));     memset(rs, 0, sizeof(rs));     memset(tag, 0, sizeof(tag));     for (int i = 1; i <= n; i++) add(rt, 0, inf, a[i]);     sort(b + 1, b + m + 1, rcmp);     j = 1;     for (int i = n; i >= 1; i--) {       while (j <= m && b[j].r >= a[i]) modifyy(rt, 0, inf, b[j].l), ++j;       int t = askk(rt, 0, inf, a[i] - 1);       Small[i] += t;       Big[i] += i - 1 - b2[i] - t;     }     long long tmp = 0;     for (int i = 1; i <= n; i++) {       tmp += 1ll * Big[i] * (Big[i] - 1) / 2;       tmp += 1ll * Small[i] * (Small[i] - 1) / 2;     }     tmp = (tmp + spc) / 2;     printf( %I64d n , ans - tmp);     return 0;   }