#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool st;
const int N = 6e5 + 5;
ll n, m, tr[N<<2], ans = 0, cnt = 0;
struct node{
ll val, pos;
}a[N];
struct py{
ll l , r, id;
}q[N], b[N];
bool cmp1(py a, py b){return a.r < b.r;}
bool cmp(node x, node y){return x.val < y.val;}
ll lowbit(ll x){return x&(-x);}
void add(ll x, ll k) {for(int i = x; i <= n; i += lowbit(i)) tr[i]+=k; return;}
ll query(ll x) {ll ans = 0; for(int i = x; i > 0; i -= lowbit(i)) ans+=tr[i]; return ans;}
ll add_(ll l, ll r) {if(l > r) swap(l, r); b[++cnt] = (py){l, r, 0};}
bool ed;
int main() {
scanf("%lld%lld", &n, &m);
if(n == 1) {
puts("0");
return 0;
}
for(int i = 1; i <= n; i++) {
scanf("%lld", &a[i].val);
a[i].pos = i;
}
sort(a+1, a+n+1, cmp);
for(int i = 1; i <= n; i++) {
if(i == 1) add_(a[i].pos, a[i+1].pos);
if(i == n) add_(a[i].pos, a[i-1].pos);
if(1 < i && i < n) {
if(abs(a[i].val-a[i+1].val) < abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i+1].pos);
if(abs(a[i].val-a[i+1].val) == abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i+1].pos), add_(a[i].pos, a[i-1].pos);
if(abs(a[i].val-a[i+1].val) > abs(a[i].val-a[i-1].val)) add_(a[i].pos, a[i-1].pos);
}
}
for(int i = 1; i <= m; i++) {
ll l, r;
scanf("%lld%lld", &l, &r);
if(l > r) swap(l, r);
q[i] = (py){l, r, i};
}
sort(b+1, b+cnt+1, cmp1);
sort(q+1, q+m+1, cmp1);
ll j = 1;
for(int i = 1; i<= m; i++) {
while(j <= cnt && b[j].r <= q[i].r && cnt!=0) add(b[j].l, 1), j++;
ll l = q[i].l, r = q[i].r;
ll sum = query(r)-query(l-1);
ans += sum*q[i].id;
}
printf("%lld", ans);
return 0;
}