此生听取所有的WA声
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct fhq
{
struct tree
{
int ls,rs,key,sz,pro;
}t[2000009];
int tot=0,rt=0;
int addn(int x)
{
t[++tot].key=x;
t[tot].pro=rand();
t[tot].sz=1;
return tot;
}
void pushup(int x)
{
t[x].sz=t[t[x].ls].sz+t[t[x].rs].sz+1;
}
void split_num(int pos,int x,int &l,int &r)
{
if(!pos)
{
l=0;
r=0;
return ;
}
if(t[pos].key<=x)
{
l=pos;
split_num(t[l].rs,x,t[l].rs,r);
}
else
{
r=pos;
split_num(t[r].ls,x,l,t[r].ls);
}
pushup(pos);
}
void split_rank(int pos,int k,int &p1,int &p2)
{
if(!pos) p1=p2=0;
else
{
int ln=t[t[pos].ls].sz;
if(ln<k)
{
p1=pos;
split_rank(t[pos].rs,k-ln-1,t[p1].rs,p2);
}
else
{
p2=pos;
split_rank(t[pos].ls,k,p1,t[p2].ls);
}
pushup(pos);
}
}
int merge(int l,int r)
{
if(!l||!r) return l|r;
if(t[l].pro<=t[r].pro)
{
t[l].rs=merge(t[l].rs,r);
pushup(l);
return l;
}
else
{
t[r].ls=merge(l,t[r].ls);
pushup(r);
return r;
}
}
void insert(int x)
{
int l=0,r=0;
split_num(rt,x-1,l,r);
rt=merge(merge(l,addn(x)),r);
}
void dlt(int x)
{
int l,r,p1,p2,tt;
split_num(rt,x-1,l,r);
split_num(r,x,p1,p2);
tt=merge(t[tt].ls,t[tt].rs);
rt=merge(p1,merge(tt,p2));
}
int get_rk(int x)
{
int l=0,r=0;
split_num(rt,x-1,l,r);
int rk=t[l].sz+1;
rt=merge(l,r);
return rk;
}
int get_num(int pos,int k)
{
int ln=t[t[pos].ls].sz+1;
if(ln==k) return t[pos].key;
if(ln>k) return get_num(t[pos].ls,k);
else return get_num(t[pos].rs,k-ln);
}
int pre(int x)
{
int l=0,r=0;
split_num(rt,x-1,l,r);
int ans,l2=l;
while(t[l2].rs)
{
l2=t[l2].rs;
}
ans=t[l2].key;
rt=merge(l,r);
return ans;
}
int suc(int x)
{
int l=0,r=0;
split_num(rt,x,l,r);
int ans,r2=r;
while(t[r2].ls)
{
r2=t[r2].ls;
}
ans=t[r2].key;
rt=merge(l,r);
return ans;
}
}treap;
int n;
signed main()
{
int ans;
srand(time(0));
cin>>n;
cin>>ans;
treap.insert(ans);
while(--n)
{
int x;
cin>>x;
ans+=min(abs(treap.pre(x)-x),abs(treap.suc(x)-x));
treap.insert(x);
}
cout<<ans<<endl;
return 0;
}