#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,m,p[500005],vis[500005],lim[500005];
inline ll read() {
ll x=0,f=1;
char ch=getchar();
while(!isdigit(ch)) {
if(ch=='-') {
f=-1;
ch=getchar();
}
}
while(isdigit(ch)) {
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main() {
n=read();m=read();
for (ll i=1; i<=n; i++) {
p[i]=read();
vis[p[i]]=i;
lim[i]=0x3f3f3f3f3f;
}
for (ll j=1; j<=m; j++) {
// 当包含f时,右端点不能大于vis[t]
ll f,t;
f=read();t=read();
if (vis[f]>vis[t])swap(f,t);
lim[f]=min(lim[f],vis[t]);
}
multiset<ll> ml;
ll r=0,ans=0;
for (ll l=1; l<=n; l++) {
while(r<n&&(ml.empty()||r+1<*ml.begin()))r++,ml.insert(lim[p[r]]);
ans+=r-l+1;
ml.erase(ml.find(lim[p[l]]));
}
printf("%lld",ans);
return 0;
}
感觉上一层循环+find是差不多O(n2)的,能否卡掉?如果能卡掉,是否可以使用优化成 O(nlogn)?