写红温了,只知道自己预处理有误,但不知道怎么调
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
struct Node{
int l,r,id;
}q[N];
int n,m,a[N],bl,l,r,b[N],sum,s,tot;
pair<int,int> h[N];
map<pair<int,int>,int> vis;
/*
*/
bool cmp(const Node &a,const Node &b){
return (a.l/bl==b.l/bl)?a.r<b.r:a.l<b.l;
}
void add(int x){
vis[h[a[x]]]++;
if(vis[h[a[x]]]==1){
s++;
}
}
void del(int x){
vis[h[a[x]]]--;
if(vis[h[a[x]]]==0){
s--;
}
}
signed main(){
cin>>n>>m;
bl=pow(n,2.0/3.0);
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
a[i]=lower_bound(b+1,b+n+1,a[i])-b;
//cout<<a[i]<<endl;
}
h[++tot]={a[1],a[2]},h[++tot]={a[n],a[n-1]};
// h[a[1]].l=a[2],h[a[n]].l=a[n-1];
for(int i=1;i<=n;i++){
if(b[a[i]]-b[a[i-1]]<b[a[i+1]]-b[a[i]]){
h[++tot]={a[i],a[i-1]};
// h[a[i]].l=a[i-1];
}else if(b[a[i]]-b[a[i-1]]==b[a[i+1]]-b[a[i]]){
h[++tot]={a[i],a[i-1]};
h[++tot]={a[i],a[i+1]};
// h[a[i]].l=a[i-1];
// h[a[i]].r=a[i+1];
}else {
h[++tot]={a[i],a[i+1]};
// h[a[i]].l=a[i+1];
}
}
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" to "<<h[a[i]]<<endl;
// }
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
int cl=1,cr=0;
for(int i=1;i<=m;i++){
int l=q[i].l,r=q[i].r;
while(cl<l)del(cl++);
while(cl>l)add(--cl);
while(cr<r)add(++cr);
while(cr>r)del(cr--);
//cout<<cl<<" "<<cr<<endl;
sum+=q[i].id*s;
//cout<<q[i].id<<" ";
}
cout<<sum<<endl;
return 0;
}