RE三个点
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL k,cnt,cnt1,ans;
struct data{
LL l,r;
};
data a[100005];
int val[100005],num[100005];
LL b[100005],d[100005],rankk[100005],tree[100005];
LL find(LL x){
LL l=0,r=cnt1;
while(l<=r){
LL mid=(l+r)>>1;
if(val[mid]>x) r=mid-1;
if(val[mid]==x) return mid;
if(val[mid]<x) l=mid+1;
}
}
void add(LL x,LL k){
for(;x<=cnt1;x+=(x&-x)) tree[x]+=k;
}
LL sum(LL x){
LL tmpp=0;
for(;x>0;x-=(x&-x)) tmpp+=tree[x];
return tmpp;
}
int main(){
scanf("%lld",&k);
for(LL i=1;i<=k;i++){
scanf("%lld%lld",&a[i].l,&a[i].r);
if(d[a[i].l]==0) b[++cnt]=a[i].l,d[a[i].l]=1;
if(d[a[i].r]==0) b[++cnt]=a[i].r,d[a[i].r]=1;
}
sort(b+1,b+cnt+1);
cnt1=0;
for(LL i=0;i<=cnt;i++){
val[cnt1]=b[i];
num[cnt1++]=1;
if(b[i+1]>b[i]+1){
val[cnt1]=b[i]+1;
num[cnt1++]=b[i+1]-b[i]-1;
}
}
cnt1--;
for(LL i=1;i<=cnt1;i++) rankk[i]=i;//离散化
for(LL i=1;i<=k;i++){
LL x=find(a[i].l),y=find(a[i].r);
swap(rankk[x],rankk[y]);
swap(num[x],num[y]);
}
for(LL i=cnt1;i>=1;i--){
ans+=1LL*sum(rankk[i]-1)*num[i];
add(rankk[i],num[i]);
}
printf("%lld",ans);
return 0;
}