WA 了第二个点。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#define int long long
#define endl putchar('\n')
#define pii pair<int,int>
using namespace std;
const int N=3e5+10;
struct node {int v,id;}e[N];
struct edge {int l,r,id;}s[N];
struct Tree_Array
{
int n,t[N];
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int k)
{
for (;x<=n;x+=lowbit(x))
t[x]+=k;
return ;
}
int query(int x)
{
int tot=0;
for (;x;x-=lowbit(x))
tot+=t[x];
return tot;
}
}tr;
char eof_flag;inline char read(int*s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}
int n,m;
int num,sum[N],ans;
vector<pii> good;
inline bool operator <(const edge &x,const edge &y) {return x.l<y.l;}
inline bool operator <(const node &x,const node &y) {return x.v<y.v;}
inline void add(int x,int y)
{
if (x>y) swap(x,y);
good.push_back({x,y});
return ;
}
signed main()
{
read(&n),read(&m);
tr.n=n;
for (register int i=1;i<=n;i++) read(&e[i].v),e[i].id=i;
sort(e+1,e+n+1);
add(e[1].id,e[2].id),add(e[n].id,e[n-1].id);
for (int i=2;i<=n-1;i++)
{
if (abs(e[i].v-e[i-1].v)==abs(e[i].v-e[i+1].v))
{
add(e[i].id,e[i-1].id);
add(e[i].id,e[i+1].id);
}
if (abs(e[i].v-e[i-1].v)<abs(e[i].v-e[i+1].v)) add(e[i].id,e[i-1].id);
if (abs(e[i].v-e[i-1].v)>abs(e[i].v-e[i+1].v)) add(e[i].id,e[i+1].id);
}
sort(good.begin(),good.end());
num=good.size()-1;
for (int i=1;i<=m;i++) read(&s[i].l),read(&s[i].r),s[i].id=i;
sort(s+1,s+m+1);
for (int i=m;i>=1;i--)
{
while (good[num].first>=s[i].l)
{
tr.update(good[num].second,1);
num--;
}
sum[s[i].id]=tr.query(s[i].r);
}
for (int i=1;i<=m;i++) ans+=sum[i]*i;
write(ans),endl;
return 0;
}