按照第一篇题解写的:
#include <bits/stdc++.h>
using namespace std;
int n,m,l,tt;
long long s[300005],ans;
struct xy{
int x,y,z;
}a[300005],b[300005],t[600005];
bool cmp1(xy u,xy v)
{
return u.x<v.x;
}
bool cmp2(xy u,xy v)
{
if (u.y==v.y) return u.x<v.x;
return u.y<v.y;
}
bool cmp3(xy u,xy v)
{
if (u.y==v.y) return u.x<v.x;
return u.y<v.y;
}
void Addpair(int u,int v)
{
t[++l].x=min(a[u].x,a[v].x);
t[l].y=max(a[u].x,a[v].x);
}
void Add(int t,long long u)
{
for (int j=t;j<=n;j+=j&(-j))
{
s[j]+=1ll*u;
}
}
long long getsum(int t)
{
long long ans=0;
for (int j=t;j;j-=j&(-j))
{
ans+=s[j];
}
return ans;
}
signed main()
{
ios::sync_with_stdio(0); cout.tie(nullptr);
cin>>n>>m;
if (n==1)
{
cout<<0<<endl;
return 0;
}
for (int i=1;i<=n;i++)
{
cin>>a[i].x;
a[i].y=i;
}
sort(a+1,a+n+1,cmp1);
Addpair(1,2);
Addpair(n-1,n);
for (int i=2;i<n;i++)
{
if (a[i].x-a[i-1].x==a[i+1].x-a[i].x)
{
Addpair(i-1,i);
Addpair(i,i+1);
}
else if (a[i].x-a[i-1].x<a[i+1].x-a[i].x) Add(i,i-1);
else Add(i,i+1);
}
sort(t+1,t+l+1,cmp2);
for (int i=1;i<=m;i++)
{
cin>>b[i].x>>b[i].y;
b[i].z=i;
}
sort(b+1,b+m+1,cmp3);
tt=1;
for (int i=1;i<=m;i++)
{
while (t[tt].y<=b[i].y && tt<=l) Add(t[tt++].y,1);
ans+=1ll*b[i].z*(tt-1-getsum(b[i].x-1));
}
cout<<ans<<endl;
return 0;
}