#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
struct fhq_tree
{
int l,r;
int key;
int val;
int siz;
}t[maxn];
int cnt,rt;
inline int newnode(int val)
{
t[++cnt].key=rand();
t[cnt].val=val;
t[cnt].siz=1;
return cnt;
}
inline void update(int now)
{
t[now].siz=t[t[now].l].siz+t[t[now].r].siz+1;
}
inline void split(int val,int now,int &x,int &y)
{
if(!now)
x=y=0;
else
{
if(t[now].val<=val)
{
x=now;
split(val,t[now].r,t[now].r,y);
}
else
{
y=now;
split(val,t[now].l,x,t[now].l);
}
update(now);
}
}
inline int merge(int x,int y)
{
if(!x||!y)
return x+y;
if(t[x].key>t[y].key)
{
t[x].r=merge(t[x].r,y);
update(x);
return x;
}
else
{
t[y].l=merge(x,t[y].l);
update(y);
return y;
}
}
int x,y,z;
inline void insert(int val)
{
split(val,rt,x,y);
rt=merge(merge(x,newnode(val)),y);
}
inline int pre(int val)
{
split(val,rt,x,y);
int now=x;
while(t[now].r)
now=t[now].r;
rt=merge(x,y);
return t[now].val;
}
inline int nxt(int val)
{
split(val-1,rt,x,y);
int now=y;
while(t[now].l)
now=t[now].l;
rt=merge(x,y);
return t[now].val;
}
int main()
{
int n;
n=read();
int res=0;
for(int i=1;i<=n;i++)
{
int a;
a=read();
int trans=min(abs(pre(a)-a),abs(nxt(a)-a));
insert(a);
res+=trans;
}
printf("%d\n",res);
return 0;
}