#include<bits/stdc++.h>
#define maxn 300050
#define ll long long
using namespace std;
struct node{
ll l,r,num;
};
struct opp{
ll L,R;
}anss[maxn];
bool operator<(node fir,node sec){
return sec.r<=fir.r;
}
bool cmp(opp fir,opp sec){
return fir.R<sec.R;
}
priority_queue<node> q;
ll n,m,a[maxn],l,r,aa[maxn],cont=1,l2,r2,ans,c[maxn];
ll tott=0;
map<ll,ll> idx;
ll lowbit(ll op){return op&-op;}
void init(){
if (n==1){
cout<<0;
exit(0);
}
for (ll i=2;i<n;i++){
ll inde=idx[a[i]];
if (abs(a[i]-a[i-1])==abs(a[i+1]-a[i])){
ll minn=min(idx[a[i]],idx[a[i-1]]);
ll maxx=max(idx[a[i]],idx[a[i-1]]);
node in1={minn,maxx,cont++};
q.push(in1);
minn=min(idx[a[i]],idx[a[i+1]]);
maxx=max(idx[a[i]],idx[a[i+1]]);
node in2={minn,maxx,cont++};
q.push(in2);
}
else{
if (abs(a[i]-a[i-1])<abs(a[i+1]-a[i])){
ll minn=min(idx[a[i]],idx[a[i-1]]);
ll maxx=max(idx[a[i]],idx[a[i-1]]);
node in={minn,maxx,cont++};
q.push(in);
}
else{
ll minn=min(idx[a[i]],idx[a[i+1]]);
ll maxx=max(idx[a[i]],idx[a[i+1]]);
node in={minn,maxx,cont++};
q.push(in);
}
}
}
ll minn1=min(idx[a[1]],idx[a[2]]);
ll maxx1=max(idx[a[1]],idx[a[2]]);
node in1={minn1,maxx1,cont++};
q.push(in1);
ll minn2=min(idx[a[n]],idx[a[n-1]]);
ll maxx2=max(idx[a[n]],idx[a[n-1]]);
node in2={minn2,maxx2,cont++};
q.push(in2);
return ;
}
void inser(ll le){
for (ll i=le;i<=n;i+=lowbit(i)) c[i]++;
return ;
}
ll query(ll le){
ll tot=0;
for (ll i=le-1;i>0;i-=lowbit(i)) tot+=c[i];
return tot;
}
ll solve(ll le,ll ri){
while (!q.empty()){
node tem=q.top();
if (tem.r>ri) break;
inser(tem.l);
q.pop();
tott++;
}
return tott-query(le);
}
int main(){
scanf("%lld%lld",&n,&m);
for (int i=1;i<=n;i++){
scanf("%lld",&a[i]);
idx[a[i]]=i;
aa[i]=a[i];
}
sort(a,a+1+n);
init();
for (int i=1;i<=m;i++){
scanf("%lld%lld",&l2,&r2);
anss[i].L=l2;
anss[i].R=r2;
}
sort(anss,anss+1+m,cmp);
for (int i=1;i<=m;i++){
ans+=i*solve(anss[i].L,anss[i].R);
}
printf("%lld",ans);
}