一直wa60...
对着代码看了半天发现是while访问到动态数组外面去 然后update了些奇怪的数据的问题
话说访问到动态数组洛谷测评机不会报re还运行下去吗...
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
struct inp{
int val;
int l,r;
};
struct node{
int id,val;
};
vector<node>v;
vector<node>v2;
bool cmp(node a,node b){
return a.val<b.val;
}
bool cmp1(inp a,inp b){
return a.r<b.r;
}
struct{
long long val,l,r;
}st[maxn*4];
inline void pushup(int rt){
st[rt].val=st[rt*2].val+st[rt*2+1].val;
}
void build(int l,int r,int rt){
st[rt].l=l;
st[rt].r=r;
if(l==r)
return;
int m=l+r>>1;
build(l,m,rt*2);
build(m+1,r,rt*2+1);
}
long long query(int rt,int s,int e){
int l=st[rt].l;
int r=st[rt].r;
if(s<=l&&r<=e) return st[rt].val;
if(e<l||r<s) return 0;
return query(rt*2,s,e)+query(rt*2+1,s,e);
}
void update(int rt,int s){
int l=st[rt].l;
int r=st[rt].r;
if(l==r){
st[rt].val++;
return;
}
int m=l+r>>1;
if(s<=m) update(rt*2,s);
else update(rt*2+1,s);
pushup(rt);
}
vector<inp>ipt;
int main(){
int n,m;
scanf("%d%d",&n,&m);
int i,j;
build(1,n,1);
v.clear();
int tmp;
for(i=1;i<=n;i++){
scanf("%d",&tmp);
v.push_back({i,tmp});
}
sort(v.begin(),v.end(),cmp);
v2.push_back({min(v[0].id,v[1].id),max(v[0].id,v[1].id)});
v2.push_back({min(v[n-2].id,v[n-1].id),max(v[n-2].id,v[n-1].id)});
for(i=1;i<v.size()-1;i++){
if(v[i].val-v[i-1].val==v[i+1].val-v[i].val){
v2.push_back({min(v[i-1].id,v[i].id),max(v[i-1].id,v[i].id)});
v2.push_back({min(v[i].id,v[i+1].id),max(v[i].id,v[i+1].id)});
}
else if(v[i].val-v[i-1].val<v[i+1].val-v[i].val){
v2.push_back({min(v[i-1].id,v[i].id),max(v[i-1].id,v[i].id)});
}
else{
v2.push_back({min(v[i].id,v[i+1].id),max(v[i].id,v[i+1].id)});
}
}
int l,r;
long long ans=0;
sort(v2.begin(),v2.end(),cmp);
for(i=1;i<=m;i++){
scanf("%d%d",&l,&r);
ipt.push_back({i,l,r});
}
sort(ipt.begin(),ipt.end(),cmp1);
int op1=0,op2=0;
for(auto it:ipt){
while(it.r>=v2[op2].val){//<---problem
update(1,v2[op2].id);
op2++;
if(op2==v2.size()) break;
}
if(it.l==it.r)
continue;
ans+=1ll*it.val*query(1,it.l,it.r);
}
printf("%lld\n",ans);
}