#include<algorithm>
#include<iostream>
#include<cstdio>
#define pair pairty
#define ls x<<1,l,mid
#define rs x<<1|1,mid+1,r
using namespace std;
const int N=3e5+10;
int n,m,cnt;
long long ans;
struct tree{int lc,rc;}g[N<<2];
struct node
{
int val,num;
bool operator <(const node a)const{return a.val<val;}
}a[N<<2];
struct good
{
int l,r;
bool operator <(const good a)const{return r<a.r;}
}pairty[N<<2];
struct asks
{
int l,r,i;
bool operator <(const asks a)const{return r<a.r;}
}ask[N<<2];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
void merge(int l,int r)
{
pair[++cnt].l=min(a[l].num,a[r].num);
pair[cnt].r=max(a[l].num,a[r].num);
}
void update(int x,int l,int r,int p,int flag)
{
if(l>p||r<p)return;
if(l==p&&r==p)
{
if(flag==0)g[x].lc++;
else g[x].rc++;
return;
}
int mid=(l+r)>>1;
update(ls,p,flag);
update(rs,p,flag);
g[x].lc=g[x<<1].lc+g[x<<1|1].lc;
g[x].rc=g[x<<1].rc+g[x<<1|1].rc;
}
int query(int x,int l,int r,int ql,int qr,int flag)
{
if(ql<=l&&r<=qr)
{
if(flag==0)return g[x].lc;
else return g[x].rc;
}
if(ql>r||l>qr)return 0;
int mid=(l+r)>>1;
return query(ls,ql,qr,flag)+query(rs,ql,qr,flag);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
a[i].num=i;
a[i].val=read();
}
sort(a+1,a+1+n);
merge(1,2);merge(n,n-1);
for(int i=2;i<n;i++)
{
int absl=abs(a[i].val-a[i-1].val),absr=abs(a[i].val-a[i+1].val);
if(absl==absr)merge(i,i-1),merge(i,i+1);
else if(absl<absr) merge(i,i-1);
else merge(i,i+1);
}
sort(pair+1,pair+1+cnt);
for(int i=1;i<=m;i++)
ask[i].l=read(),ask[i].r=read(),ask[i].i=i;
sort(ask+1,ask+1+m);
int cntt=1;
for(int i=1;i<=m;i++)
{
while(ask[i].r>=pair[cntt].r&&cntt<=cnt)
{
update(1,1,n,pair[cntt].l,0);
update(1,1,n,pair[cntt].r,1);
cntt++;
}
ans+=(query(1,1,n,1,ask[i].r,1)-query(1,1,n,1,ask[i].l-1,0))*ask[i].i;
}
printf("%lld",ans);
return 0;
}