rt,除hack外其他全WA,有大佬能帮看一下吗?悬1关
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
const int maxn=1e6+10;
int q,n,l,r,bit[maxn],ans;
struct node{
int val,id;
}a[maxn];
struct line{
int l,r;
};
struct ques{
int l,r,id;
};
vector<ques>qu;
vector<line>g;
bool cmp(node a,node b){
return a.val<b.val;
}
bool cmp2(line a,line b){
if(a.r!=b.r)
return a.r<b.r;
return a.l<b.l;
}
bool cmp3(ques a,ques b){
if(a.r!=b.r)
return a.r<b.r;
return a.l<b.l;
}
void update(int x,int v){
while(x<=n)
bit[x]+=v,x+=lowbit(x);
}
int query(int x){
int ans=0;
while(x)
ans+=bit[x],x-=lowbit(x);
return ans;
}
void add(int x,int y){
int l=min(a[x].id,a[y].id),r=max(a[x].id,a[y].id);
g.push_back({x,y});
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i].val),a[i].id=i;
sort(a+1,a+1+n,cmp);
a[0].val=LONG_LONG_MIN,a[n+1].val=LONG_LONG_MAX;
for(int i=1;i<=n;i++){
if(i==1){
add(i,i+1);
continue;
}
if(i==n){
add(i,i-1);
continue;
}
if(abs(a[i].val-a[i-1].val)<abs(a[i+1].val-a[i].val))
add(i,i-1);
else if(abs(a[i].val-a[i-1].val)>abs(a[i+1].val-a[i].val))
add(i,i+1);
else add(i,i+1),add(i,i-1);
}
for(int i=1;i<=q;i++){
scanf("%lld%lld",&l,&r);
qu.push_back({l,r,i});
}
sort(qu.begin(),qu.end(),cmp3);
sort(g.begin(),g.end(),cmp2);
int idx=0;
for(int i=0;i<qu.size();i++){
while(g[idx].r<=qu[i].r&&idx<g.size())
update(g[idx++].l,1);
ans+=qu[i].id*(query(qu[i].r)-query(qu[i].l-1));
}
printf("%lld",ans);
return 0;
}