#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll n,m,tot;
ll tr[3000001];
ll lowbit(ll x){
return x&(-x);
}
void add(ll x,ll k){
while(x<=n){
tr[x]+=k;
x+=lowbit(x);
}
}
ll query(ll x){
ll ans=0;
while(x){
ans+=tr[x];
x-=lowbit(x);
}
return ans;
}
struct q{
ll l,r,id;
}ask[3000001];
bool cmp3(q a,q b){
return a.r<b.r;
}
struct quer{
ll l,r;
}pr[6006000];
bool cmp2(quer a,quer b){
return a.r<b.r;
}
struct Node{
ll val,id;
}num[3000001];
bool cmp(Node a,Node b){
return a.val<b.val;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
cin>>num[i].val;
num[i].id=i;
}
sort(num+1,num+n+1,cmp);
for(ll i=1;i<=n;i++){
if(i==1 || abs(num[i+1].val-num[i].val)<abs(num[i-1].val-num[i].val)){
pr[++tot]=((quer){min(num[i].id,num[i+1].id),max(num[i].id,num[i+1].id)});
}
else if(i==n || abs(num[i-1].val-num[i].val)<abs(num[i+1].val-num[i].val)){
pr[++tot]=((quer){min(num[i].id,num[i-1].id),max(num[i].id,num[i-1].id)});
}
else if(abs(num[i-1].val-num[i].val)==abs(num[i+1].val-num[i].val)){
pr[++tot]=((quer){min(num[i].id,num[i-1].id),max(num[i].id,num[i-1].id)});
pr[++tot]=((quer){min(num[i].id,num[i+1].id),max(num[i].id,num[i+1].id)});
}
}
sort(pr+1,pr+1+n,cmp2);
for(ll i=1;i<=m;i++) {
cin>>ask[i].l>>ask[i].r;
ask[i].id=i;
}
sort(ask+1,ask+m+1,cmp3);
ll aft=1,ans=0;
for(ll i=1;i<=m;i++){
for(;aft<=tot && pr[aft].r<=ask[i].r;aft++){
add(1,1);
add(pr[aft].l+1,-1);
}
ans+=1ll*query(ask[i].l)*ask[i].id;
}
cout<<ans;
return 0;
}